我最近一直在研究自定义框架,所以在发布我的问题之前,我将解释我组织框架的方式。
有一个主类,所有其他类都可以从中扩展。所有其他类在它们之间互连,并带有一个具有类名称的变量。更容易说,我有MAIN
班。我还有班级THEME
,URI
,INIT
。
在框架初始化之后,如果我得到MAIN
实例并将其分配给变量,请说$main
,我可以使用其他类,如下所示:
$main->theme;
$main->uri;
$main->init;
如果我愿意,我甚至可以使用$main->theme->uri->theme->init
:D,但不能$main->theme->theme
。
此外,从类内部(MAIN
除外),我可以访问其他类,如$this->init
,$this->theme
等。
指向这些类的属性是引用。
现在我担心,当我print_r
$main
变量时,我会收到很多RECURSION
元素。框架加载速度很快,内存消耗为28MB,但我仍然得到了递归。这是否意味着我组织我的框架的方式是错误的,或者只是print_r
函数看到指向同一类的指针,并避免无限递归?
好的,这是TF_TFUSE类的print_r(我正在讨论的主要类)。这里只实现了另外两个类(也减少了输出)。
TF_TFUSE Object
(
[framework_version] => 2.1
[load] => TF_LOAD Object
(
[_the_class_name] => LOAD
[framework_version] => 2.1
[buffer] => TF_BUFFER Object
(
[_filters:protected] => Array
(
)
[_buffer:protected] =>
[_the_class_name] => BUFFER
[_is_end:protected] =>
[framework_version] => 2.1
[load] => TF_LOAD Object
*RECURSION*
)
)
[buffer] => TF_BUFFER Object
(
[_filters:protected] => Array
(
)
[_buffer:protected] =>
[_the_class_name] => BUFFER
[_is_end:protected] =>
[framework_version] => 2.1
[load] => TF_LOAD Object
(
[_the_class_name] => LOAD
[framework_version] => 2.1
[buffer] => TF_BUFFER Object
*RECURSION*
)
)
)
答案 0 :(得分:2)
问题在于您将对象内的所有内容链接在一起。此问题通常通过创建容纳其他对象并在其间创建交互的容器类来解决。
能够做$main->theme->uri->theme->uri->theme->uri->theme->uri->theme->uri->theme->uri->theme->uri->theme->uri->theme->uri->theme->uri->theme->init
会给你一个错误的指示。 。
可能的解决方案一般表示如下:
class Manager {
$theme;
$uri;
$init;
}
主题,URI和INIT之间不再存在直接关系。
答案 1 :(得分:2)
我相信你的问题与你在彼此内部拥有其他每个类的实例有关。如果可能theme->uri
,则不应该uri->theme
。只有一个应该拥有另一个的实例,如果要有其他类的实例的话。
这样想: 我有一名球员,他拿着一个蝙蝠和一个球。 你有一个球员,他拿着一个蝙蝠和一个球,蝙蝠拿着一个球员和一个球,球拿着一个蝙蝠和一个球员。
您不需要所有这些交叉引用,您需要建立一个理智的对象层次结构。
答案 2 :(得分:1)
print_r()
函数会注意到它打印出同一个对象的次数超过两次,并将其列为*RECURSION*
条目。
组织对象的方式并没有错,但考虑一种不同的方法,即只将必要的对象传递给构造函数。这使您可以清楚地看到哪些对象可以访问和修改哪些对象,并为您的类提供更好的角色。
答案 3 :(得分:0)
有一个主类,所有其他类都可以从中扩展。
对不起,这不是你问题的直接答案,但如果是这种情况,你很可能会做一些根本错误的事情。为什么所有类都需要扩展main?
我认为这个概念问题是你其他问题的根源。