类循环依赖

时间:2018-02-07 09:20:25

标签: php 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应该返回MyInterface而不是MyAbstractClass

那会是这种情况吗?

1 个答案:

答案 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

接受的答案是公平的。