Почему эта реализация не считается совместимой с их интерфейсом 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';
}

3

Решение

Это из-за намека на тип. Если ваш typehint — (Observable $ observable), вы должны использовать точно такой же typehint во всех реализациях этого метода во всех подклассах. Узнайте больше здесь http://php.net/manual/de/language.oop5.typehinting.php.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]