通常,当子类具有与其父级不同的函数参数时,PHP Strict Standards会让您知道:
严格标准:Boele :: bla()声明应与foo.php中的Oele :: bla($ 1,Exception $ 2)兼容
它不会破坏任何东西,但它会让你知道它并不酷。我同意。
但是,施工人员似乎得到了特殊待遇:
class Oele {
function __construct($one, Exception $two) {}
function bla($one, Exception $two) {}
}
class Boele extends Oele {
function __construct(Exception $two) {}
function bla(Exception $two) {}
}
__construct()
和bla()
方法在父级和子级方面都有所不同,但PHP仅通知bla()
,而不是__construct()
。
为什么?为构造函数执行此操作是否同样“糟糕”?
(我在这里运行PHP 5.5.17,但正如你在3v4l上看到的那样,它对所有PHP 5都是一样的。)
答案 0 :(得分:4)
我无法解释原因,但PHP文档中有关于此的信息:
与其他方法不同,当使用与父__construct()方法不同的参数覆盖__construct()时,PHP不会生成E_STRICT级错误消息。
答案 1 :(得分:1)
这样做的一个主要原因是,当您实例化一个类时,它只调用子构造函数。如果您希望调用父构造函数,则必须使用parent::__construct()
显式调用它。假设子类将构建自己的构造函数并在他们认为合适时实现父类。
相比之下,如果(使用您的示例)我想调用Boele->bla()
,则可能会因为两个函数使用不同的参数命名相同而感到困惑。更糟糕的是,使用孩子调用Oele->bla()
并不容易。因此,使用不兼容的函数覆盖父函数不被视为最佳做法。
还要考虑PHP有多少方法可以约束实现类(抽象和接口)。在这些情况下,您必须使用相同的参数实现它们,否则您将收到错误。