具有可选参数的抽象方法

时间:2019-05-31 07:37:22

标签: php oop abstract-class

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版本中是否不再有效?

1 个答案:

答案 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问题的警告。