我看到了以下PHP代码片段,声明了一些接口、抽象类和具体类:
public interface MyInterface
{
public function method1() : MyAbstractClass;
}
abstract class MyAbstractClass implements MyInterface
{
protected $myVar = 1;
}
public class MyClass1 extends MyAbstractClass
{
function method1(): MyAbstractClass
{
return new MyClass1();
}
}
public class MyClass2 extends MyAbstractClass
{
function method1(): MyAbstractClass
{
return new MyClass2();
}
}一些评论员认为存在循环依赖关系,因此,method1应该返回MyInterface而不是MyAbstractClass。
情况会是这样吗?
发布于 2018-02-07 09:28:55
我会把这作为一个评论,但这是一个很长的阅读。
我想两者都不是“错”的。但似乎“正确”的是这样的东西:
public interface MyInterface
{
public function method1() : self;
}
abstract class MyAbstractClass implements MyInterface
{
protected $myVar = 1;
}
public class MyClass1 extends MyAbstractClass
{
function method1(): self // yes, you can return self
{
return $this;
}
}
public class MyClass2 extends MyAbstractClass
{
function method1(): self
{
return $this;
}
}在接口中返回self的理由是,实现该接口并始终返回$this的类总是return...well...itself。
如果要在接口中返回MyAbstractClass,这将使接口本身变得多余,因为它只能由抽象类实现,这完全违背了拥有接口的目的。
method1应该返回self或它当前驻留的类。当然,您可以返回父类,因为通过继承返回类型是正确的。
您还可以返回接口,这也是非常好的。事实上,在某种程度上,它似乎“更好”或“更正确”,但最终,它归结为return self。
我的2美分。关于method1的后一条语句是可以解释的,但最终第一条关于接口的声明绝对不应该解释。接口不应该有实现它的类的返回类型。
令人遗憾的是,PHP还没有将static作为有效的返回类型。这将从定义上解决问题。
也见此问题
PHP 7 interfaces, return type hinting and self
被接受的答案提出了一个合理的观点。
https://stackoverflow.com/questions/48659998
复制相似问题