这是我正在制作的框架的当前系统:
我在请求访问不存在的属性时创建一个对象,该属性具有通过Core类中定义的__get
函数的现有类的名称。 Core类扩展了每个类。
所以它的工作原理如下:
class Someclass extends Core
{
public function classmethod()
{
$this->otherclass->method();
}
}
这完全符合我希望它的工作方式。但是,我不知道(经过很多挫折之后)如何使用这个系统编辑/创建对象的属性。
所以这样的事情都行不通。
$this->view->somevar = "newvalue"; // this doesn't work.
我想它必须对__set函数做一些事情,但我没找到。
我收到了以下建议如何解决这个问题:
依赖注入,命名空间,单例模式。
我很想知道如何使用其中一种模式实现我想要做的事情。
我不知道选择哪个来实现我的简单问题:在其他类中使用对象,所以我不需要在__construct的参数中添加任何内容或使用全局变量。
我正在使用__autoload.
我希望我能在你的帮助下解决这个问题。
答案 0 :(得分:2)
首先,您尝试的架构非常糟糕。显然,您正在使用“魔法”来创建作为属性附加到其他对象的对象。这是不好的,因为如果你使用_ get / _set,你将很快就会遇到问题。从普通父级扩展也是一件坏事,因为它会生成巨大的继承树,并且它允许大多数对象具有多个响应性。
在开始框架之前,您可能需要查看:SOLID
现在回到你的问题,如果使用__get获取值,你也可以使用__set来设置值。
__构造方法是为了允许您使用所需的所有数据初始化对象,以实现其唯一目的。避免__construct有点愚蠢,并且失败了目的。你可能想要注意SOLID中的D,以便了解Dependency Inversion究竟是什么并理解它。
使用__set完全失去了键入接口等功能。因此,代码可能变得非常错误并且难以理解,因为流程没有很好地定义,并且分配是通过魔术在后面完成的。此外,我可以提出100万个其他原因,您尝试使用的架构是错误的,但我会将其留下另一个时间。