2016-08-31 5 views
3

나는이 두 가지 인터페이스를 가지고 : 여기이 구현이 PHP의 인터페이스와 호환되지 않는 이유는 무엇입니까?

interface Observer 
{ 
    public function notify(Observable $observable, ...$args); 
} 

interface Observable 
{ 
    public static function register(Observer $observer); 
    public function notifyObservers(); 
} 

그리고 것은 내가 구현하기 위해 노력하고 무엇 :

abstract class EventHandler implements Observer 
{ 
    abstract public function notify(Event $event, ...$args); 
} 

abstract class Event implements Observable 
{ 
    private static $handlers = []; 
    public static function register(EventHandler $handler) 
    { 
     self::$handlers []= $handler; 
    } 

    public function notifyObservers() 
    { 
     //notify loop here... 
    } 
} 

이벤트이이 관찰자관찰 가능한이벤트 핸들러이다, 권리?

왜 php는 이러한 구현이 각각의 인터페이스와 호환되지 않는 것으로 간주합니까?


나는 "호환"무슨 뜻인지의 간단한 테스트 :

class CreateEvent extends Event {} 

$createEventObj = new CreateEvent(); 
if ($createEventObj instanceof Observable) { 
    echo 'Compatible'; 
} else { 
    echo 'Incompatible'; 
} 
+0

런타임 오류가 발생합니까? – YvesLeBorg

+0

@YvesLeBorg 예, Event :: register' 및'EventHandler :: notify' 메서드에서 "imcompatible declaration"치명적인 오류가 계속 발생합니다. – CarlosCarucce

답변

1

이는 타입 힌트이다. typehint가 (Observable $ observable)이면 모든 하위 클래스에서이 메서드의 모든 구현에서 정확히 동일한 유형 힌트를 사용해야합니다. 자세한 내용은 http://php.net/manual/de/language.oop5.typehinting.php을 참조하십시오.

+0

답변 해 주셔서 감사합니다. dos의이 섹션은 불행하게도이 주제에 대해 분명하지 않습니다 ... = /. 내 질문을 업데이트하여 조금 더 명확하게 만들었습니다. – CarlosCarucce

+1

글쎄, 객체가 호환됩니다. 그러나 무엇이 그것들을 호환되게합니까?! 네, 같은 인터페이스를 관찰 할 수 있습니다. CreateEvent를 사용하여 메서드를 정의하면 일반 폼에서 특정 폼으로 전환됩니다. 이러한 접근 방식은 주요 OOP 규칙 중 하나 인 인터페이스 나 프로그램에 대한 코드를 작성하지만 특정 클래스/구현에 대해서는 작성하지 않습니다. @CarlosCarucce –

+0

대신 Event :: register'에서 Observer를 typechecking하고 있습니다. 이견있는 사람? – CarlosCarucce