【问题标题】:Extended PHP class and public static methods with same name must have compatible signatures扩展的 PHP 类和同名的公共静态方法必须具有兼容的签名
【发布时间】:2015-07-30 23:13:09
【问题描述】:

只是想知道为什么我们在这里有 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

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

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

【问题讨论】:

标签: php methods static extend


【解决方案1】:

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

显然可以在实例上调用静态函数,这就是即使对于静态函数也会显示此警告的原因。另见https://3v4l.org/FPEUj

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多