我最近一直在研究自定义框架,因此在发布我的关注之前,我将解释我组织框架的方式。
有一个主类,所有其他类都从它扩展而来。所有其他类都通过一个具有类名的变量在它们之间相互连接。说得更简单,我有 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*
)
)
)
最佳答案
问题在于您将对象内部的所有内容链接在一起。 这个问题通常通过创建一个容器类来解决,该容器类包含其他对象并在它们之间创建交互。
为了能够做到 $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;
}
并且 THEME、URI 和 INIT 之间不再有直接关系。
关于php - 数组/对象递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7850652/