【问题标题】:Class Circular Dependency类循环依赖
【发布时间】:2018-07-17 12:26:38
【问题描述】:

我看过PHP代码的如下sn-p,声明了一些接口、抽象类和具体类:

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

会这样吗?

【问题讨论】:

    标签: php circular-dependency


    【解决方案1】:

    我会将此作为评论发布,但阅读时间很长。

    我想这两者本身都不是“错误的”。但是看起来“正确”的是这样的:

    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 interfaces, return type hinting and self

    接受的答案是公平的。

    【讨论】:

    • 也许有点误导。我返回了$this 用于说明目的,但可以是同一类的新实例。我现在要改变它@Andrew
    • 我写的就是,如果您返回同一类的新实例,self 部分仍然适用。
    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 2010-09-12
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多