关于php:Class Circular Dependency

Class Circular Dependency

我看到下面的一段PHP代码,声明了一些接口、抽象类和具体类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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或当前所在的类。当然,您可以返回父类,因为通过继承,返回类型是正确的。

您还可以返回接口,这也非常好。实际上,在某种程度上,它似乎"更好"或"更正确",但最终归结为return self

我的2美分。后一个关于method1的声明是开放的,可以解释,但最后第一个关于接口的声明绝对不应该是。接口不应具有实现它的类的返回类型。

很遗憾,PHP还没有将static作为有效的返回类型。这将从定义上解决这个问题。

也可以看到这个问题

php 7接口,返回类型提示和self

公认的答案是有道理的。