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

时间:2010-06-25 03:37:54

标签: php methods standards-compliance

Strict Standards: Declaration of childClass::customMethod() should be compatible with that of parentClass::customMethod()

PHP中出现此错误的可能原因是什么?我在哪里可以找到有关兼容的含义的信息?

5 个答案:

答案 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”的方法。实际上,他们两个都在做相同的事情,只是返回一个类,但是具有与我之前所述不同的名称空间。

希望这可以帮助某人。