Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数组/对象递归_Php_Recursion - Fatal编程技术网

Php 数组/对象递归

Php 数组/对象递归,php,recursion,Php,Recursion,我最近一直在开发一个定制框架,所以在发布我的关注点之前,我将解释我组织框架的方式 有一个主类,所有其他类都从中扩展。所有其他类都通过一个具有类名称的变量在它们之间互连。简单地说,我有MAIN类。我还有类主题,URI,初始化 框架初始化后,如果我获取MAIN实例并将其分配给变量,比如说$MAIN,我可以使用其他类似的类: $main->theme; $main->uri; $main->init; 如果我想:D,我甚至可以使用$main->theme->uri->theme->

我最近一直在开发一个定制框架,所以在发布我的关注点之前,我将解释我组织框架的方式

有一个主类,所有其他类都从中扩展。所有其他类都通过一个具有类名称的变量在它们之间互连。简单地说,我有
MAIN
类。我还有类
主题
URI
初始化

框架初始化后,如果我获取
MAIN
实例并将其分配给变量,比如说
$MAIN
,我可以使用其他类似的类:

$main->theme;
$main->uri;
$main->init;
如果我想:D,我甚至可以使用
$main->theme->uri->theme->init
,但是不行
$main->theme->theme

另外,从类内部(除了
MAIN
),我可以访问其他类,如
$this->init
$this->theme
,等等。 指向这些类的属性是引用

现在我关心的是,当我
打印
$main
变量时,我得到了很多
递归
元素。框架加载速度很快,内存消耗是28MB,但我仍然得到了递归。这是否意味着我组织框架的方式是错误的,或者只是
print\r
函数看到指向相同类的指针,并避免了无限递归

好的,这里有一个TF_TFUSE类(我刚才提到的主要类)的打印。这里只实现了另外两个类(也减少了输出)

有一个主类,所有其他类都从中扩展

很抱歉,这不是对你问题的直接回答,但如果是这样的话,你很可能在做一些根本错误的事情。为什么所有类都需要扩展main

我认为这个概念上的问题是其他问题的根源。

函数将注意到它打印同一对象超过两次,并将其列为
*递归*
条目

<>你组织对象的方式并不是错误的,但是考虑一种不同的方法,即只将必要的对象传递给构造函数。这使您能够清楚地看到哪些对象可以访问和修改哪些对象,并为类提供更好的角色


有关详细信息,请阅读

问题在于您正在将对象内的所有内容链接在一起。此问题通常通过创建一个容器类来解决,该容器类保存其他对象并在它们之间创建交互

能够做
$main->theme->uri->theme->uri->theme->theme->uri->theme->uri->theme->uri->theme->theme->uri->theme->theme->init应该会给你一个错误的指示

一种可能的解决方案概括如下:

class Manager {
    $theme;
    $uri;
    $init;
}

THEME、URI和INIT之间不再有直接的关系。

我认为您的问题更多地与您在彼此内部有其他每个类的实例这一事实有关<如果
uri->theme
是可能的,那么code>theme->uri
应该是不可能的。如果任何一个类都有其他类的实例,那么只有一个类应该有另一个类的实例

你可以这样想: 我有一个球员,他拿着球棒和球。 你有一个球员,他拿着一个球棒和一个球,球棒拿着一个球员和一个球,球拿着一个球棒和一个球员


你不需要所有这些交叉引用,你需要建立一个健全的对象层次结构。

看看我同意他不应该扩展main,但这不是他的问题的根源。@LeviMorrison他似乎不是通过is-a关系(继承)来扩展它们,而是通过has-a关系来扩展它们(main包含其他类的实例。)从这个意义上说,这很可能是他的问题的根源。@middus,这似乎是事实,也是我在回答中提到的问题,也是Chris Browne在我之后提到的问题。这在你的帖子中似乎并不清楚。如果是的话,我只会+1,继续前进,从来没有写过答案。@LeviMorrison:我写的是评论,而不是middus。我同意这里并不完全清楚。:@robjb我道歉,伙计。对我来说,现在是清晨:)他们之间需要有关系。我需要在另一个类中访问一个类的功能,但要像在大多数框架(codeignitier、phpcake等)中那样做,@Levi建议的方法仍然允许每个对象访问管理器中包含的所有对象。唯一的区别是你的类依赖于管理器,而不是相互依赖$经理->uri;或者$this->manager->theme;等但是,我认为在CodeIgniter中的实现方式是不同的。我想这正是我正在做的。我有意将其他类的存在注入当前类中,以便可以通过当前类的属性访问其他类。然而,我不确定从这个链接,如果我做得不对,或者对于这样一个模式来说这是正常的,那么你似乎正在将一个对象和所有其他对象传递到每个对象上(令人困惑)。您应该只通过构造函数传递每个类所需的对象(该类所依赖的对象)。每个类对每个其他类都有一个必需的依赖性,除了扩展它的main。您能提供一个简单的类结构示例吗?这将有助于了解你正在尝试做什么。
class Manager {
    $theme;
    $uri;
    $init;
}