У меня есть эти два интерфейса:
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';
}
Это из-за намека на тип. Если ваш typehint — (Observable $ observable), вы должны использовать точно такой же typehint во всех реализациях этого метода во всех подклассах. Узнайте больше здесь http://php.net/manual/de/language.oop5.typehinting.php.
Других решений пока нет …