为什么不';t PHP严格标准抱怨构造函数参数的差异


Why doesn't PHP Strict Standards complain about difference in constructor arguments?

通常,当一个子类具有与其父类不同的函数参数时,PHP严格标准会让您知道:

严格标准:Boele::bla()的声明应与foo.php 中的Oele::bla($one,Exception$two)兼容

它不会打碎任何东西,但它让你知道它并不酷。我同意。

然而,建设者似乎得到了特殊待遇:

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()

3v4l 的证明

为什么对构造函数这样做不是同样"糟糕"吗?

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

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

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

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

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

相比之下,如果(使用您的示例)我想调用Boele->bla(),那么用不同的参数命名两个相同的函数可能会让人感到困惑。更糟糕的是,使用child调用Oele->bla()并不是一种简单的方法。因此,用不兼容的函数覆盖父函数并不是最佳做法。

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