添加参数到重写方法E_STRICT观察

时间:2011-07-14 21:08:36

标签: php oop coding-style

看来(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不允许方法签名被重载覆盖。所以,我不得不问。我的观察是一个错误/缺陷还是实际上纠正了预期的行为?

此外,如果默认参数参数没问题,为什么非默认参数参数不合适?

2 个答案:

答案 0 :(得分:5)

如果向重写方法添加非默认参数,则子类不再满足超类定义的约定。您无法正确调用test2-> stuff(),因为此方法现在需要一个参数 - 但超类表示您应该能够在没有参数的情况下调用它。因此E_STRICT警告。

如果你添加了一个默认参数,你仍然可以调用test3-> stuff()(来自你的例子) - 正如超类所期望的那样 - 因此合同不会被破坏。实际上,通过添加可选参数,您只需对其进行扩展。

答案 1 :(得分:-1)

这不是一个错误,是可以接受的PHP编程实践。

请注意,多个覆盖可能导致programmer headaches,但应尽可能避免。

或者我通常要么只有一个扩展类来覆盖每个类,要么只重载实际类本身的类方法。