PHP 7 接口,返回类型提示和自
更新:PHP 7.4 现在确实支持协方差和逆变,这解决了这个问题中提出的主要问题。
我在PHP 7中使用返回类型提示时遇到了一些问题。我的理解是,提示意味着你打算让一个实现类返回自身。因此,我在我的接口中使用了指示,但是当我尝试实际实现接口时,我遇到了兼容性错误。: self
: self
以下是我遇到的问题的简单演示:
interface iFoo
{
public function bar (string $baz) : self;
}
class Foo implements iFoo
{
public function bar (string $baz) : self
{
echo $baz . PHP_EOL;
return $this;
}
}
(new Foo ()) -> bar ("Fred")
-> bar ("Wilma")
-> bar ("Barney")
-> bar ("Betty");
预期输出为:
弗雷德·威尔玛·巴尼·贝蒂
我实际得到的是:
PHP 致命错误: 声明 Foo::bar(int $baz): Foo 必须与 iFoo::bar(int $baz): iFoo 在测试中.php在第 7 行
问题是Foo是iFoo的实现,所以据我所知,实现应该与给定的接口完全兼容。我大概可以通过更改接口或实现类(或两者)来解决此问题,以按名称而不是使用返回接口提示,但我的理解是,语义上意味着“返回您刚刚调用方法的类的实例”。因此,将其更改为接口将意味着理论上,当我的意图是调用的实例时,我可以返回实现接口的任何实例。self
self
这是PHP中的疏忽还是故意的设计决策?如果是前者,是否有机会在 PHP 7.1 中修复它?如果不是,那么返回提示的正确方法是什么,您的接口希望您返回刚刚调用该方法进行链接的实例?