Строгие стандарты: декларация childClass :: customMethod () должна быть совместима с классом parentClass :: customMethod ()
Каковы возможные причины этой ошибки в PHP? Где я могу найти информацию о том, что значит быть совместимым ?
childClass::customMethod()
имеет разные аргументы или другой уровень доступа (public / private / protected), чем 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(); // ... } }
Просто для того, чтобы расширить эту ошибку в контексте интерфейса, если вы вводите тип своих параметров функции следующим образом:
интерфейс A
use Bar; interface A { public function foo(Bar $b); }
Класс B
class B implements A { public function foo(Bar $b); }
Если вы забыли включить оператор use
в свой класс реализации (класс B), вы также получите эту ошибку, даже если параметры метода идентичны.
Абстрактный класс A
abstract class A { function foo(); }
Детский класс B
class B { function foo($a=null, $b=null, $c=null) { //do what you want with the parameters. } }
Пример:
$b = new B(); $b->foo(); $b->($m, $n, $l);
Цель состоит в том, чтобы сделать как $b->foo
и $b->($m, $n, $l)
хорошо.