看起来(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
,并且应该尽可能避免。
或者,我通常有一个扩展类来覆盖每个类,或者只是在实际的类本身中重载一个类方法。