使用每个特征或孩子向班级添加信息



假设我有一个保存数组的类

class A {
protected $list = [1];
}

然后我想通过特征或扩展类向实例添加信息。

trait B {
protected $list = [2, 3];
}
class C extends A {
protected $list = [4];
}

然后如果我构建这样的东西

$d = new class extends C {
use B;
protected $list = [5];
}

我需要[1, 2, 3, 4, 5]列表而不是[5].显然这不是要走的路,我只是用它来说明我需要做什么。问题是我不知道会有多少特征或继承,因为我只设计父类。我很想使用构造函数,但如果有多个特征,它很快就会变得丑陋。

在 PHP 中没有原生方法可以做到这一点。

从我的头顶上,你可以或多或少地完成同样的事情,例如,Ruby,其中一切都是一个对象(包括类本身(,你可以覆盖或挂接像extend这样的方法。

但是在PHP中考虑使用类似Decorator Pattern的东西:

interface HasList
{
public function list(): array;
}
class A implements HasList
{
private $list = [1];
public function list(): array
{
return $this->list;
}
}
class B implements HasList {
private $list = [2, 3];
private $objectToDecorate;
public function __construct(HasList $objectToDecorate)
{
$this->objectToDecorate = $objectToDecorate;
}
public function list(): array
{
return array_merge($this->objectToDecorate->list(), $this->list);       
}
}
$list = (new B(new A))->list();

最新更新