Объявление методов должно быть совместимо с родительскими методами в PHP
Strict Standards: Declaration of childClass::customMethod() should be compatible with that of parentClass::customMethod()
каковы возможные причины этой ошибки в PHP? Где я могу найти информацию о том, что значит быть совместимость?
4 ответов:
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); }Класс B
class B implements A { public function foo(Bar $b); }Если вы забыли включить
useзаявление на классе исполнителей (класс B), то вы также получите эту ошибку, даже если параметры метода идентичны.
Comments