方法声明应与 PHP 中的父方法兼容

2022-08-30 07:18:36
Strict Standards: Declaration of childClass::customMethod() should be compatible with that of parentClass::customMethod()

PHP 中此错误的可能原因是什么?在哪里可以找到有关兼容意味着什么的信息?


答案 1

childClass::customMethod()具有与 不同的参数,或不同的访问级别(公共/私有/受保护)。parentClass::customMethod()


答案 2

此消息意味着某些可能的方法调用在运行时可能会失败。假设您有

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

这似乎比它需要的更具限制性,我认为这是由于内部因素。

可见性差异会导致不同的错误,但出于相同的基本原因。任何方法的可见性都不能低于其父方法。


推荐