Строгие стандарты: объявление childClass :: customMethod () должно быть совместимо с таковым parentClass :: customMethod ()
Каковы возможные причины этой ошибки в PHP? Где я могу найти информацию о том, что значит быть совместимый?
childClass::customMethod()
имеет разные аргументы или другой уровень доступа (публичный / частный / защищенный), чем parentClass::customMethod()
,
Это сообщение означает, что существуют определенные возможные вызовы методов, которые могут не работать во время выполнения. Предположим, у вас есть
class A { public function foo($a = 1) {;}}
class B extends A { public function foo($a) {;}}
function bar(A $a) {$a->foo();}
Компилятор только проверяет вызов $ a-> foo () на соответствие требованиям A :: foo (), который не требует параметров. Однако $ a может быть объектом класса B, для которого требуется параметр, и поэтому вызов не будет выполнен во время выполнения.
Это однако никогда не может потерпеть неудачу и не вызывает ошибку
class A { public function foo($a) {;}}
class B extends A { public function foo($a = 1) {;}}
function bar(A $a) {$a->foo();}
Таким образом, ни один метод не может иметь больше обязательных параметров, чем его родительский метод.
Это же сообщение также генерируется, когда подсказки типа не совпадают, но в этом случае PHP является еще более ограничительным. Это дает ошибку:
class A { public function foo(StdClass $a) {;}}
class B extends A { public function foo($a) {;}}
как это:
class A { public function foo($a) {;}}
class B extends A { public function foo(StdClass $a) {;}}
Это кажется более ограничительным, чем это должно быть, и я предполагаю, что это из-за внутренних органов.
Различия в видимости вызывают другую ошибку, но по той же основной причине. Ни один метод не может быть менее видимым, чем его родительский метод.
если вы хотите сохранить форму ООП, не отключая ошибки, вы также можете:
class A
{
public function foo() {
;
}
}
class B extends A
{
/*instead of :
public function foo($a, $b, $c) {*/
public function foo() {
list($a, $b, $c) = func_get_args();
// ...
}
}
Просто чтобы раскрыть эту ошибку в контексте интерфейса, если вы набираете тип, намекая на параметры вашей функции, например, так:
интерфейс А
use Bar;
interface A
{
public function foo(Bar $b);
}
Класс б
class B implements A
{
public function foo(Bar $b);
}
Если вы забыли включить use
оператора класса реализации (класса B), вы также получите эту ошибку, даже если параметры метода идентичны.