【发布时间】:2011-07-14 21:08:36
【问题描述】:
看来(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 不允许方法签名被 重载 覆盖。所以,我不得不问。我的观察是错误/缺陷还是实际上 正确 预期的行为?
另外,如果默认实参参数可以,为什么非默认实参参数不行?
【问题讨论】:
-
我设置了 error_reporting(E_ALL) 并且无法重现 E_STRICT 错误。你能发布你看到的错误吗?另外,这不是“重载”,而是“覆盖”。
-
不,不行。阅读Liskov substitution principle 和 PHP 允许这样做。
-
@helloandre,E_STRICT 未包含在 E_ALL 中。要开启 E_STRICT 通知,请设置
error_reporting(E_ALL | E_STRICT); -
@helloandre 和 E_STRICT 不会为这种情况生成 :)
-
我没有收到属于 E_STRICT 的任何错误。我正在获得输出。
标签: php oop coding-style