我对接口有疑问。我可以让接口指定一个没有参数的方法,但是在类中仍然有参数吗?
interface FooInterface {
public function bar();
}
class Foo implements FooInterface {
public function bar($parameters = array())
{
return 'bar';
}
}
我在PHP 5.5.10中没有在本地执行此操作时出错,但在PHP 5.4.0中执行此操作。
答案 0 :(得分:2)
问题是bar
类中Foo
方法的声明实际上与FooInterface
中的声明不兼容。
FooInterface::bar
是一个没有参数的方法,Foo::bar
有一个参数(虽然是可选参数)。这会在早期的PHP 5.4.x版本中引发异常。
显然,在以后的版本中,只要参数是可选的,PHP开发人员就已经决定声明一个参数多于接口或父类的方法。
修改强>
此外,方法的签名必须匹配,即类型提示和所需参数的数量必须相同。例如,如果子类定义了一个可选参数,抽象方法的签名没有,则签名中没有冲突。
因此,您遇到的行为似乎是早期版本的PHP中的一个错误。不幸的是,我无法找到错误报告或发布说明,这些报告会指出修复错误的时间和PHP版本。
我现在可以测试的最低版本是PHP 5.4.9,并且该错误似乎已经修复,因为我可以毫无错误地运行代码。