我在
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");
预期产出为:
Fred
Wilma
Barney
Betty
我实际得到的是:
PHP Fatal error: Declaration of Foo::bar(int $baz): Foo must be compatible with iFoo::bar(int $baz): iFoo in test.php on line 7
事情是Foo是iFoo的一个实现,所以据我所知,实现应该与给定的接口完全兼容.我可以推测通过改变接口或实现类(或两者)来修改这个问题,以通过名称而不是使用self来提示接口,但是我的理解是语义上的自我意味着“返回你刚刚调用的类的实例方法“.因此,将其更改为接口意味着理论上我可以返回实现接口的任何实例,当我的意图是被调用的实例将被返回时.
这是PHP的监督还是故意的设计决定?如果是前者有可能在PHP 7.1中看到它固定?如果不是那么什么是正确的返回方式暗示你的界面希望你返回你刚才调用方法链接的实例?