我有这两个接口:
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...
}
}
事件是 Observable 而 EventHandler 是 Observer ,对吧?
那么为什么php认为这些实现与它们各自的接口不兼容?
对我的意思进行简单测试"兼容":
class CreateEvent extends Event {}
$createEventObj = new CreateEvent();
if ($createEventObj instanceof Observable) {
echo 'Compatible';
} else {
echo 'Incompatible';
}
答案 0 :(得分:1)
这是因为类型提示。如果你的typehint是(Observable $ observable),你应该在所有子类的所有实现中使用完全相同的typehint。在这里阅读更多http://php.net/manual/de/language.oop5.typehinting.php。