Intereting Posts
Нужен PHP-скрипт для распаковки и прокрутки зашифрованного файла Получить идентификатор пользователя при входе пользователя в систему с использованием Username & Password Имена файлов UTF8 в PHP и различные кодировки Unicode PHP / PDO / MySQL: вставка в MEDIUMBLOB хранит плохие данные PHP mb_ereg_replace не заменяет, пока preg_replace работает по назначению Использование триггера в Oracle для регистрации изменений в таблице избегая инъекций MySQL с классом Zend_Db Zend_Session: сеанс должен быть запущен до того, как любой вывод будет отправлен в браузер Как получить доступ к переменной 'name' формы из PHP как хранить (в php) и использовать (в javascript) большой объем данных Являются ли массивы в PHP переданы по значению или по ссылке? Получите дополнительный массив с определенным значением Онлайн-потоковое видео Вызов функции-члена execute () для boolean в Как установить Pdftk на моем сервере?

Декларация методов должна быть совместима с родительскими методами в PHP

  Строгие стандарты: декларация 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) хорошо.