0

这是我正在制作的框架的当前系统:

__get我根据请求创建一个对象以访问不存在的属性,该属性通过核心类中定义的函数具有现有类的名称。Core 类扩展了每个类。

所以它是这样工作的:

class Someclass extends Core
{
    public function classmethod()
    {
        $this->otherclass->method();
    }
}

这正是我希望它工作的方式。但是,我不知道(经过很多挫折之后)如何使用这个系统编辑/创建对象的属性。

所以这样的事情是行不通的。

$this->view->somevar = "newvalue"; // this doesn't work. 

我想它必须与 __set 函数有关,但我没能找到。

我收到了以下如何解决这个问题的建议:

依赖注入、命名空间、单例模式。

我很想看看如何使用其中一种模式来实现我正在尝试做的事情。

我不知道选择哪个来解决我的简单问题:在其他类中使用对象,所以我不需要将任何东西放入 __construct 的参数或使用全局变量。

我在用__autoload.

我希望我能在你的帮助下解决这个问题。

4

1 回答 1

2

首先,您尝试的架构非常糟糕。显然,您正在使用“魔术”来创建作为属性附加到其他对象的对象。这很糟糕,因为如果你使用_get / _set,你迟早会遇到问题。从一个共同的父级扩展也是一件坏事,因为它会生成巨大的继承树,并且它允许大多数对象具有多个责任。

在开始一个框架之前,您可能需要查看:SOLID

现在回到你的问题,如果你使用 __get 来获取一个值,你也可以使用 __set 来设置一个值。

__construct 方法的存在是为了允许您使用它需要的所有数据来初始化对象,以实现他的唯一目的。避免 __construct 有点愚蠢,并且违背了目的。您可能需要注意 SOLID 中的 D,以便了解依赖倒置的真正含义并理解它。

使用 __set 完全失去了输入提示接口等的能力。因此,代码可能会变得非常错误并且难以理解,因为流程没有很好地定义,并且分配是通过魔术在后面完成的。此外,我还可以提出 100 万个其他原因来说明您尝试使用的架构是错误的,但我会再等一下。

于 2012-12-30T15:36:01.650 回答