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 {

我看到了以下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


会是这样吗?

我会将此作为评论发表,但这是一篇很长的文章

我想这两者本身都没有错。但似乎“正确”的是这样的:

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
部分仍然适用。