这是我目前正在制作的框架系统:
我在请求访问一个不存在的属性时创建了一个对象,该属性通过Core类中定义的__get
函数具有一个现有类的名称。Core类继承了每个类。
它是这样的
class Someclass extends Core
{
public function classmethod()
{
$this->otherclass->method();
}
}
这正是我想要的工作方式。然而,我不知道(经过很多挫折)如何编辑/创建对象的属性,使用这个系统。
所以像这样的东西是行不通的。
$this->view->somevar = "newvalue"; // this doesn't work.
我猜它与__set函数有关系,但我没能发现。
关于如何解决这个问题,我收到了以下建议:依赖注入、命名空间、单例模式。
我想看看如何实现我正在尝试使用这些模式之一。
我不知道该选择哪个来实现我的简单问题:在其他类中使用对象,所以我不需要把任何东西放入__construct的参数或使用全局变量。
我使用__autoload.
首先,您尝试的架构非常糟糕。显然,您正在使用"魔法"来创建附加到其他对象的属性对象。这很糟糕,因为如果您使用_get/_set,您很快就会遇到问题。另外,从一个共同的父类扩展也是一件坏事,因为它会产生巨大的继承树,并且它允许大多数对象具有多个职责。
在开始使用框架之前,您可能需要查看:SOLID
现在回到你的问题,如果你使用__get获取一个值,你也可以使用__set设置一个值。
__construct方法的存在是为了允许你用它所需要的所有数据来初始化对象,以实现它的唯一目的。避免__construct有点愚蠢,并且违背了目的。为了了解依赖倒置到底是什么并理解它,你可能需要注意SOLID中的D。
使用__set完全失去了对接口进行类型提示等的能力。因此,代码可能会变得非常有bug,并且难以遵循,因为流没有很好地定义,并且分配是在后台通过魔术完成的。此外,我可以想出一百万个其他的原因,你正在尝试使用的架构是错误的,但我将留在另一个时间。