Почему это объявление метода PHP не распознает пространство имен подсказки типа?

Я пытаюсь написать библиотеку на основе расширений Doctrine, которая предоставляет следующий интерфейс:

namespace Gedmo\Mapping;

use Doctrine\Common\Persistence\Mapping\ClassMetadata;

interface Driver {
  public function readExtendedMetadata(ClassMetadata $meta, array &$config);

  public function setOriginalDriver($driver);
}

В моем собственном коде я реализую этот интерфейс:

namespace Avit\Schedulable\Mapping\Driver;

use Gedmo\Mapping\Driver,
    Doctrine\Common\Persistence\Mapping\ClassMetadata,
    Doctrine\Common\Annotations\AnnotationReader;

class Annotation implements Driver {
  public function readExtendedMetadata(ClassMetadata $meta, array &$config) {
    // my implementation
  }
}

Я получаю сообщение об ошибке: Объявление Avit\Schedulable\Mapping\Driver\Annotation::readExtendedMetadata() должно быть совместимо с объявлением Gedmo\Mapping\Driver::readExtendedMetadata()

Я могу избежать ошибки, если удалю подсказку типа ClassMetadata в своем методе.

Я погуглил некоторую информацию, в которой говорится, что эта ошибка возникает, когда пространство имен не соответствует. Это имеет смысл, так как я объявляю этот класс в своем собственном пространстве имен, однако я использую то же самое пространство имен Doctrine для ClassMetadata, которое использует исходный интерфейс Driver.

Почему подсказка типа не распознается?


person Andrew Vit    schedule 18.01.2012    source источник
comment
Является ли отсутствие точки с запятой после использования во втором коде опечаткой?   -  person TimWolla    schedule 19.01.2012
comment
У вас есть собственный ClassMetadata-класс или -интерфейс в вашем пространстве имен?   -  person KingCrunch    schedule 19.01.2012
comment
Исправлена ​​опечатка. @KingCrunch, нет, у меня нигде нет собственного определения этого класса. Даже если бы я это сделал, не будет ли тот, который указан в предложении использования, иметь приоритет?   -  person Andrew Vit    schedule 19.01.2012
comment
@AndrewVit Нет, не будет, но тогда вы должны получить предупреждение или заметить.   -  person KingCrunch    schedule 19.01.2012


Ответы (1)


Метод в Driver здесь https://github.com/l3pp4rd/DoctrineExtensions/blob/master/lib/Gedmo/Mapping/Driver.php, похоже, не имеет подсказки типа ClassMetadata.

Не возражаете, если проверьте тот, который вы используете?

person Rannnn    schedule 19.01.2012
comment
Спасибо, похоже, это было недавнее изменение в этой библиотеке. Тем не менее, я смущен, почему он не увидит это как ту же сигнатуру метода. - person Andrew Vit; 19.01.2012