Строгие стандарты: объявление childClass :: customMethod () должно быть совместимо с объявлением parentClass :: customMethod ()
Каковы возможные причины этой ошибки в PHP? Где я могу найти информацию о том, что значит быть совместимым ?
php
methods
standards-compliance
waiwai933
источник
источник
function customMethod( ... )
use Closure;
подсказку типа, но тогда я не добавлял его в начало своего класса (поскольку подсказка типа былаClosure
). Итак ... обязательно проверьте, не упускаете ли вы подобные зависимости.Ответы:
childClass::customMethod()
имеет другие аргументы или другой уровень доступа (публичный / частный / защищенный), чемparentClass::customMethod()
.источник
parentClass::customMethod($thing = false)
иchildClass::customMethod($thing)
вызовет ошибку, потому что дочерний метод не определил значение по умолчанию для первого аргумента.&
) в аргументах также может вызвать эту ошибку.Это сообщение означает, что существуют определенные возможные вызовы методов, которые могут завершиться ошибкой во время выполнения. Предположим, у вас есть
Компилятор проверяет только вызов $ a-> foo () на соответствие требованиям A :: foo (), который не требует параметров. Однако $ a может быть объектом класса B, которому требуется параметр, поэтому вызов не удастся во время выполнения.
Однако это никогда не может потерпеть неудачу и не вызывает ошибку.
Таким образом, ни один метод не может иметь больше требуемых параметров, чем его родительский метод.
Такое же сообщение генерируется, когда подсказки типа не совпадают, но в этом случае PHP еще более строг. Это дает ошибку:
как это делает:
Это кажется более строгим, чем нужно, и я предполагаю, что это связано с внутренними особенностями.
Различия в видимости вызывают другую ошибку, но по той же основной причине. Ни один метод не может быть менее заметным, чем его родительский метод.
источник
если вы хотите сохранить форму ООП без отключения ошибок, вы также можете:
источник
func_get_args()
, то есть, вB
,public function foo($a = null, $b = null, $c = null)
как это не нарушает контракт , обещанныйA
.Просто чтобы расширить эту ошибку в контексте интерфейса, если вы вводите намекающие параметры вашей функции следующим образом:
интерфейс A
Класс B
Если вы забыли включить
use
оператор в свой реализующий класс (класс B), вы также получите эту ошибку, даже если параметры метода идентичны.источник
Я столкнулся с этой проблемой при попытке расширить существующий класс из GitHub. Я попытаюсь объяснить себя, сначала напишу класс так, как я думал, а затем класс таким, какой он есть сейчас.
Что я хотя
Что я наконец сделал
Похоже, что эта ошибка возникает также, когда вы используете метод, возвращающий класс с пространством имен, и пытаетесь вернуть тот же класс, но с другим пространством имен. К счастью, я нашел это решение, но я не до конца понимаю преимущества этой функции в php 7.2, для меня нормально переписывать существующие методы класса по мере необходимости, включая переопределение входных параметров и / или даже поведения метод.
Одним из недостатков предыдущего подхода является то, что IDE не могла распознать новые методы, реализованные в \ mycompany \ CutreApi \ ClassOfVendor (). Итак, пока я перейду к этой реализации.
В настоящее время сделано
Итак, вместо того, чтобы пытаться использовать «любой» метод, я написал новый под названием «getWhatever». На самом деле они оба делают то же самое, просто возвращая класс, но с разными пространствами имен, как я описывал ранее.
Надеюсь, это кому-то поможет.
источник