Class 循环依赖

Class Circular Dependency

我看过以下 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 应该 return MyInterface 而不是 MyAbstractClass

会是这样吗?

我会 post 将此作为评论,但读起来很长。

我想 "wrong" 本身也不是。但是看起来 "right" 应该是这样的:

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;
    }
}

接口中 return self 的原因是 class 实现该接口并且始终 return $this 将始终 return.. .well...本身。

如果你要在接口中 return MyAbstractClass ,那会使接口本身变得多余,因为它只能由那个抽象 Class 实现,这完全违背了目的甚至有一个界面。

method1 应该 return self 或它当前所在的 class。您当然可以 return 父级 class 因为通过继承 return 类型是正确的。

你也可以return这个界面,也很好。事实上,在某种程度上它似乎是 "more better" 或 "more correct",但归根结底,它归结为 return self.

我的 2 美分。关于 method1 的后一种说法可以解释,但最终关于接口的第一种说法绝对不应该。接口永远不应该有实现它的 class 的 return 类型。


糟糕的是 PHP 还没有 static 作为有效的 return 类型。这将根据定义解决问题。


也看到这个问题

已接受的答案有道理。