为被覆盖的E_STRICT observation方法添加参数


adding parameters to overridden method E_STRICT observation

看起来(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不允许方法签名被

重载覆盖。所以,我不得不问。我的观察是一个错误/缺陷还是实际上正确的预期行为?此外,如果默认实参形参是可以的,为什么非默认实参形参就不行呢?

如果您将非默认参数添加到重写的方法中,则子类将不再满足父类定义的契约。您不能正确地调用test2->stuff(),因为这个方法现在需要一个参数—但是超类说您应该能够不带参数地调用它。因此出现了E_STRICT警告。

如果你添加了一个默认的参数,你仍然可以调用test3->stuff()(从你的例子中)——正如超类所期望的那样——这样契约就不会被破坏。实际上,通过添加可选参数,您只是扩展了它。

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

请注意,多次覆盖可能会导致programmer headaches,并且应该尽可能避免。

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