Strict Standards: Declaration of childClass::customMethod() should be compatible with that of parentClass::customMethod()
PHP中出现此错误的可能原因是什么?我在哪里可以找到有关兼容的含义的信息?
答案 0 :(得分:120)
childClass::customMethod()
具有与parentClass::customMethod()
不同的参数或不同的访问级别(公共/私有/受保护)。
答案 1 :(得分:33)
此消息表示某些可能的方法调用可能在运行时失败。假设你有
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) {;}}
这似乎比它需要的更具限制性,我认为是由于内部原因。
可见性差异导致不同的错误,但出于同样的基本原因。没有方法比其父方法更不可见。
答案 2 :(得分:17)
如果您想保留OOP表格而不关闭任何错误,您还可以:
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();
// ...
}
}
答案 3 :(得分:0)
只是为了在界面的上下文中扩展这个错误,如果你输入类似提示你的函数参数如下:
界面A
use Bar;
interface A
{
public function foo(Bar $b);
}
B类
class B implements A
{
public function foo(Bar $b);
}
如果您忘记在实现类(B类)中包含use
语句,那么即使方法参数相同,您也会收到此错误。
答案 4 :(得分:0)
在尝试从GitHub扩展现有类时遇到了这个问题。我要尝试解释一下自己,首先按原样编写课程,然后再按现在的课程进行。
我该怎么办
namespace mycompany\CutreApi;
use mycompany\CutreApi\ClassOfVendor;
class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
public function whatever(): ClassOfVendor
{
return new ClassOfVendor();
}
}
我终于完成了
namespace mycompany\CutreApi;
use \vendor\AwesomeApi\ClassOfVendor;
class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
public function whatever(): ClassOfVendor
{
return new \mycompany\CutreApi\ClassOfVendor();
}
}
因此,当您使用返回命名空间类的方法,并尝试返回相同的类但使用其他命名空间时,似乎也会出现此错误。幸运的是,我已经找到了该解决方案,但是我并没有完全理解php 7.2中此功能的好处,对我来说,通常可以根据需要重写现有的类方法,包括重新定义输入参数和/或行为。方法。
先前方法的一个缺点是,IDE无法识别\ mycompany \ CutreApi \ ClassOfVendor()中实现的新方法。因此,现在,我将继续该实现。
当前完成
namespace mycompany\CutreApi;
use mycompany\CutreApi\ClassOfVendor;
class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
public function getWhatever(): ClassOfVendor
{
return new ClassOfVendor();
}
}
因此,我没有尝试使用“任何”方法,而是编写了一个新的名为“ getWhatever”的方法。实际上,他们两个都在做相同的事情,只是返回一个类,但是具有与我之前所述不同的名称空间。
希望这可以帮助某人。