我已经看到了以下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
。
答案 0 :(得分:4)
我发布此评论作为评论,但这是一个长期阅读。
我认为两者都不是"错误"每本身。但似乎"正确"会是这样的:
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
的类将始终返回...... well ...本身。
如果您要在界面中返回MyAbstractClass
,那么这会使界面本身变得多余,因为它只能由抽象类实现,这完全违背了甚至有接口的目的。
method1
应该返回self
或当前所在的类。您当然可以返回父类,因为通过继承,返回类型是正确的。
您也可以返回界面,这也很完美。事实上,在某种程度上它似乎更好"或者"更正确",但最终归结为return self
。
我的2美分。关于method1
的后一个陈述可以解释,但最终第一个关于界面的陈述绝对不应该。接口永远不应该具有实现它的类的返回类型。
PHP很难将static
作为有效的返回类型。根据定义,这将解决问题。
也可以看到这个问题
PHP 7 interfaces, return type hinting and self
接受的答案是公平的。