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 类型。这将根据定义解决问题。
也看到这个问题
已接受的答案有道理。
我看过以下 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 类型。这将根据定义解决问题。
也看到这个问题
已接受的答案有道理。