此question与之相关。我正在尝试做类似的事情:
abstract class Foo
{
abstract public function doStuff();
}
class Bar extends Foo
{
public function doStuff($arg1, $arg2)
{
// ...
}
}
new Bar;
OP声明与上述作品类似的代码:
以下是我正在寻找的东西,它似乎在没有警告的情况下工作。
但是,它无法正常工作。我收到类似这样的错误:
致命错误:Bar :: doStuff($ arg1,$ arg2)的声明必须与Foo :: doStuff()兼容
我只想验证过去与OP的示例兼容的东西在当今的PHP版本中是否不再有效?
答案 0 :(得分:0)
我不知道其他用户的声明,但是此代码完全无效。
并不是因为最近PHP发生了变化。从5以后的任何PHP版本中,那都不是有效的语法。例如,您可以看到旧PHP版本here的输出。
扩展方法不是“兼容的”(所需参数的数量和类型与扩展方法的参数不匹配)。
如果需要,您可以这样做:
class Bar extends Foo
{
public function doStuff($arg1 = null, $arg2 = null)
{
// ...
}
}
由于参数是可选的,因此Bar::doStuff()
的所需参数的数量和类型与其父代保持兼容。
该类是抽象类,意味着错误是致命。但是,如果您扩展了非抽象方法,则会收到警告:
警告:Bar :: doStuff($ arg1,$ arg2)声明应与Foo :: doStuff()兼容
在PHP 5至5.6上,您只会收到错误报告设置为显示E_STRICT
问题的警告。