Объявление методов должно быть совместимо с родительскими методами в PHP - PullRequest
97 голосов
/ 25 июня 2010
Strict Standards: Declaration of childClass::customMethod() should be compatible with that of parentClass::customMethod()

Каковы возможные причины этой ошибки в PHP? Где найти информацию о том, что значит быть совместимым ?

Ответы [ 4 ]

120 голосов
/ 25 июня 2010

childClass::customMethod() имеет другие аргументы или другой уровень доступа (публичный / частный / защищенный), чем parentClass::customMethod().

33 голосов
/ 11 февраля 2012

Это сообщение означает, что существуют определенные возможные вызовы методов, которые могут не работать во время выполнения.Предположим, у вас есть

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) {;}}

Это кажется более ограничительным, чем это должно быть, и я предполагаю, что это связано с внутренними органами.Различия в видимости вызывают другую ошибку, но по той же основной причине.Ни один метод не может быть менее видимым, чем его родительский метод.

18 голосов
/ 06 декабря 2014

Если вы хотите сохранить форму ООП, не отключая ошибки, вы также можете:

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();
        // ...

    }
}
0 голосов
/ 21 марта 2017

Просто чтобы расширить эту ошибку в контексте интерфейса, если вы набираете тип, намекая параметры вашей функции следующим образом:

интерфейс A

use Bar;

interface A
{
    public function foo(Bar $b);
}

Класс B

class B implements A
{
    public function foo(Bar $b);
}

Если вы забыли включить оператор use в свой реализующий класс (класс B), вы также получите эту ошибку, даже если параметры методаидентичны.

...