具有相同名称的扩展PHP类和公共静态方法必须具有兼容的签名

时间:2015-05-19 08:22:47

标签: php methods static extend

只是想知道为什么我们在这里有一个E_STRICT / E_WARNING警告:

class Node
{
    public static function create($parent = null)
    {
        // ...
    }
}

class NamedNode extends Node
{
    public static function create($name, $parent = null)
    {
        // ...
    }
}

正如您在http://3v4l.org/n1s38中所看到的,我们有一个E_STRICT(PHP <7)或E_WARNING(PHP≥7)。 我真的看不出任何理由......

此外,如果我们将$name参数设为可选(http://3v4l.org/V1WHC),则不会抛出任何警告...... 这让我更加困惑:如果方法签名必须相同(并且我上面说的我想知道为什么),为什么不抛出警告?

编辑:这不是Why is overriding method parameters a violation of strict standards in PHP?的重复,因为我们在这里讨论的是静态方法。我确实认为非静态方法必须具有相同的签名(因为在这种情况下我们将使用实例),但静态方法是非常不同的:我们静态地调用该方法,因此我们知道被调用的类(例如Node::create()NamedNode::create())。

1 个答案:

答案 0 :(得分:1)

我可以理解为什么使name参数可选会阻止警告出现。 Node :: create函数接受任意类型的0或1个参数(因为您没有使用类型提示)。如果在NamedNode :: create中使name参数可选,则它同样接受0,1或2个参数,也可以是任何类型。这意味着Node :: create的所有有效调用签名对NamedNode :: create也有效。你只能增加一个额外的可能性,但这不会破坏旧代码。

显然可以在实例上调用静态函数,这就是为静态函数显示此警告的原因。另请参阅https://3v4l.org/FPEUj