【问题标题】:Interface with no parameters无参数接口
【发布时间】:2014-08-20 04:04:51
【问题描述】:

我有一个关于接口的问题。我可以让一个接口指定一个没有参数的方法,但在类中仍然有参数吗?

interface FooInterface {
    public function bar();
}

class Foo implements FooInterface {
    public function bar($parameters = array())
    {
        return 'bar';
    }
}

在 PHP 5.5.10 中本地执行此操作不会出错,但在 PHP 5.4.0 中会出错。

【问题讨论】:

  • 为什么在接口中声明一个特定的函数签名只是为了以后违反该声明?接口是专门在那里的,所以你知道你可以期待什么;如果你还是要改变期望,那有什么意义呢?

标签: php


【解决方案1】:

问题是Foo类中bar方法的声明实际上与FooInterface中的声明不兼容。

FooInterface::bar 是一种没有参数的方法,Foo::bar 有一个参数(尽管是一个可选参数)。这会在早期的 PHP 5.4.x 版本中引发异常。

显然,在以后的版本中,PHP 开发人员决定声明一个参数比接口或父类更多的方法是可以的,只要参数是可选的。

编辑:

The PHP documentation states:

此外,方法的签名必须匹配,即类型提示和所需参数的数量必须相同。例如,如果子类定义了一个可选参数,而抽象方法的签名没有,则签名没有冲突。

因此,您遇到的行为似乎是早期版本的 PHP 中的错误。不幸的是,我无法找到错误报告或发行说明来说明何时以及针对哪些 PHP 版本修复了该错误。

我现在可以测试的最低版本是 PHP 5.4.9,并且该错误似乎已修复,因为我可以无错误地运行代码。

【讨论】:

  • 您能否提供官方声明/文章/等来支持您的最后一段? 显然 X 不是一个可靠的信息。
  • 是的,正在搜索官方发行说明,直到那时:stackoverflow.com/questions/17525620/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2021-08-07
  • 1970-01-01
  • 2012-01-15
  • 2021-04-19
相关资源
最近更新 更多