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

 严格标准:childClass :: customMethod()的声明应该与parentClass :: customMethod()的兼容

PHP中出现这个错误的可能原因是什么? 我在哪里可以find关于兼容性的信息

childClass::customMethod()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();} 

所以没有一个方法比父方法可能需要更多的参数。

types提示不匹配时也会生成相同的消息,但在这种情况下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) {;}} 

这似乎比它需要更严格,我认为是由于内部。

可见性差异会导致不同的错误,但出于同样的基本原因。 没有方法可以比其父方法更不明显。

如果你想保持OOPforms而不closures任何错误,你也可以:

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

如果您忘记在您的实现类(B类)中包含use语句,那么即使方法参数相同,也会出现此错误。

抽象类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)都能正常工作。