看来(PHP 5.3)如果你要覆盖一个类方法,就可以你可以添加其他参数,只要它们有默认值。
例如,考虑类:
class test1 {
public function stuff() {
echo "Hi";
}
}
以下类扩展“test1”并生成E_STRICT警告。
class test2 extends test1 {
public function stuff($name) {
echo "Hi $name";
}
}
但是,以下内容不会产生E_STRICT警告。
class test3 extends test1 {
public function stuff($name = "") {
echo "Hi $name";
}
}
虽然类“test3”没有产生E_STRICT警告,但我一直认为PHP不允许方法签名被重载覆盖。所以,我不得不问。我的观察是一个错误/缺陷还是实际上纠正了预期的行为?
此外,如果默认参数参数没问题,为什么非默认参数参数不合适?
答案 0 :(得分:5)
如果向重写方法添加非默认参数,则子类不再满足超类定义的约定。您无法正确调用test2-> stuff(),因为此方法现在需要一个参数 - 但超类表示您应该能够在没有参数的情况下调用它。因此E_STRICT警告。
如果你添加了一个默认参数,你仍然可以调用test3-> stuff()(来自你的例子) - 正如超类所期望的那样 - 因此合同不会被破坏。实际上,通过添加可选参数,您只需对其进行扩展。
答案 1 :(得分:-1)
这不是一个错误,是可以接受的PHP编程实践。
请注意,多个覆盖可能导致programmer headaches
,但应尽可能避免。
或者我通常要么只有一个扩展类来覆盖每个类,要么只重载实际类本身的类方法。