方法声明应该与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)
都能正常工作。