通常,当一个子类具有与其父类不同的函数参数时,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有多少种方法可以约束实现类(抽象和接口)。在这些情况下,您必须使用相同的参数来实现它们,否则会出现错误。