首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类循环依赖

类循环依赖
EN

Stack Overflow用户
提问于 2018-02-07 09:20:24
回答 1查看 269关注 0票数 2

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

代码语言:javascript
复制
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

情况会是这样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-07 09:28:55

我会把这作为一个评论,但这是一个很长的阅读。

我想两者都不是“错”的。但似乎“正确”的是这样的东西:

代码语言:javascript
复制
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的类总是return...well...itself。

如果要在接口中返回MyAbstractClass,这将使接口本身变得多余,因为它只能由抽象类实现,这完全违背了拥有接口的目的。

method1应该返回self或它当前驻留的类。当然,您可以返回父类,因为通过继承返回类型是正确的。

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

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

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

也见此问题

PHP 7 interfaces, return type hinting and self

被接受的答案提出了一个合理的观点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48659998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档