【发布时间】: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())。
【问题讨论】:
-
因为它违反了最佳实践,并且因为我作为一名使用您的类库的程序员,不想知道子类中的方法与它们的类中的相同方法具有不同的调用约定继承自。
-
它不是 stackoverflow.com/questions/13423494/… 的重复,因为这里我们讨论的是
static方法。 -
查看 Liskov 替换原则,这是这里违反的最佳实践。
-
@GordonM 我知道,但正如我已经写过的,我们谈论的是 static 方法...