为什么PHP严格标准没有抱怨构造函数参数的差异?

时间:2014-10-15 18:15:00

标签: php constructor strict

通常,当子类具有与其父级不同的函数参数时,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()

Proof on 3v4l

为什么?为构造函数执行此操作是否同样“糟糕”?

(我在这里运行PHP 5.5.17,但正如你在3v4l上看到的那样,它对所有PHP 5都是一样的。)

2 个答案:

答案 0 :(得分:4)

我无法解释原因,但PHP文档中有关于此的信息:

  

与其他方法不同,当使用与父__construct()方法不同的参数覆盖__construct()时,PHP不会生成E_STRICT级错误消息。

来源:http://php.net/manual/en/language.oop5.decon.php

答案 1 :(得分:1)

这样做的一个主要原因是,当您实例化一个类时,它只调用子构造函数。如果您希望调用父构造函数,则必须使用parent::__construct()显式调用它。假设子类将构建自己的构造函数并在他们认为合适时实现父类。

相比之下,如果(使用您的示例)我想调用Boele->bla(),则可能会因为两个函数使用不同的参数命名相同而感到困惑。更糟糕的是,使用孩子调用Oele->bla()并不容易。因此,使用不兼容的函数覆盖父函数不被视为最佳做法。

还要考虑PHP有多少方法可以约束实现类(抽象和接口)。在这些情况下,您必须使用相同的参数实现它们,否则您将收到错误。