Php 类循环依赖
我看到了以下PHP代码片段,声明了一些接口、抽象类和具体类:Php 类循环依赖,php,circular-dependency,Php,Circular Dependency,我看到了以下PHP代码片段,声明了一些接口、抽象类和具体类: public interface MyInterface { public function method1() : MyAbstractClass; } abstract class MyAbstractClass implements MyInterface { protected $myVar = 1; } public class MyClass1 extends MyAbstractClass {
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
会是这样吗?我会将此作为评论发表,但这是一篇很长的文章 我想这两者本身都没有错。但似乎“正确”的是这样的:
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
的类将始终返回…嗯…本身
如果在接口中返回MyAbstractClass
,则会使接口本身变得多余,因为它只能由该抽象类实现,这完全违背了甚至拥有接口的目的
method1
应返回self
或它当前所在的类。当然,您可以返回父类,因为通过继承,返回类型是正确的
您还可以返回接口,这也非常好。事实上,在某种程度上,它似乎“更好”或“更正确”,但归根结底,它归结为返回自我
我的2美分。关于method1
的后一句话可以解释,但最终关于接口的第一句话绝对不应该解释。接口不应具有实现它的类的返回类型
PHP还没有将static
作为有效的返回类型,这太糟糕了。这将从定义上解决问题
请看这个问题
公认的答案很有道理。也许有点误导。出于说明目的,我返回了$this
,但可以是同一类的新实例。现在我将更改@AndrewWhat,如果您返回同一类的新实例,self
部分仍然适用。