Это сообщение означает, что существуют определенные возможные вызовы методов, которые могут не работать во время выполнения.Предположим, у вас есть
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) {;}}
Это кажется более ограничительным, чем это должно быть, и я предполагаю, что это связано с внутренними органами.Различия в видимости вызывают другую ошибку, но по той же основной причине.Ни один метод не может быть менее видимым, чем его родительский метод.