Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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 - Fatal编程技术网

PHP对象结构可链接性

PHP对象结构可链接性,php,Php,我正试图构建一个依赖于数百个查询的大型对象结构。为了让它发挥作用,我采取了以下方法: 每个查询结果对象都构建到一个对象中。例如,苹果表中的结果集被构建到苹果对象中。橙色结果将构建到橙色对象中。 每个对象都保存在注册表中,其中注册表是一个全局数组,具有isExistent$type、$id、add$type、$obj和get$type、$id等函数。我想在这里存储点1中的每个对象一次,以便以后访问它,而无需为对象调用另一个查询。在不同的位置多次需要大量对象。 我希望将对象链接在一起,这样我就可以执

我正试图构建一个依赖于数百个查询的大型对象结构。为了让它发挥作用,我采取了以下方法:

每个查询结果对象都构建到一个对象中。例如,苹果表中的结果集被构建到苹果对象中。橙色结果将构建到橙色对象中。 每个对象都保存在注册表中,其中注册表是一个全局数组,具有isExistent$type、$id、add$type、$obj和get$type、$id等函数。我想在这里存储点1中的每个对象一次,以便以后访问它,而无需为对象调用另一个查询。在不同的位置多次需要大量对象。 我希望将对象链接在一起,这样我就可以执行类似$tree->getFruits->getApple->getPlace->getName这样的操作。我还希望层次结构中的对象在两个方向上都链接,以便以后使用。 为什么我需要这个?例如,id为3的apple对象将在实例化$tree对象时使用一次,在创建$Vitains对象时使用一次,等等。我不想每次都向需要此对象的数据库发送另一个查询。因此,我检查如下内容:

Registry::isExistent("APPLE", $id)
然后从注册表中获取它(如果有),否则从db中调用它,然后再将它添加到注册表中

问题:我得到无限循环的原因很明显,我可以很容易地解决,但我不知道什么是最好的方法在这里

实际代码不是上面的苹果和桔子之类的示例:

$mask = new Mask($row["maskId"], $row["maskName"]);
foreach (Fields::getFieldsFor($mask->getId()) as $field) {
    $mask->addField($field);
}
Registry::add("MASK", $mask);
以及掩码字段的getter:

$mask = Registry::receive("MASK", $row["maskId"]);
        $category = Registry::receive("FIELDTYPE", $row["fieldCategory"]);
$field = new Field($row["fieldId"], $category, $row["fieldQuestion"],
                $row["fieldDescription"], $row["fieldPosition"], null, null, null, $mask);
            Registry::add("FIELD", $field);
这将产生一个无限循环。掩码由多个字段组成。在构建$mask对象时,我希望将每个字段链接到$mask数组中。在构建每个$field对象时,我希望为链接到它的$mask创建父对象。这显然会失败,因为我只添加到注册表中,在他们完成构建之后,这显然会失败,因为在此之前他们已经查看了注册表

我可以想到两种解决方案:

扔掉我的链接能力,只需将链接ID存储在我的对象中。因此,与在每个字段中存储对父掩码对象的引用不同,我只需存储id,然后从注册表中检索实际对象。这将是最简单的修复,但会丢掉可链接性

分解基本对象实例化和复杂属性。只需通过构造函数添加原语,并在构造函数之后和Registry::通过setter添加之后向每个字段添加与实际$mask对象类似的复合体

在这里最好做什么?我的总体方法有什么问题吗

我的目标仅仅是构建一个易于使用的对象结构,它将包含数百个对象,并减少冗余查询。这真的需要快一点。我也只希望每个不同的对象有一次,然后在复杂的对象结构中进行相应的链接


感谢并为冗长的描述感到抱歉。

好吧,几年前我在一个项目中使用了类似的方法。实际上,我所做的是将Getter对象存储在一个名为Registry.get的变量中;类似于:$this->get=newgetterobject$this;。现在,请注意,我将注册表作为变量传递给GetterObject,您可能会问为什么?这就是:

工作原理 GetterObject以注册表作为变量进行初始化,除非注册表作为全局绝对对象,那么就不需要它了!。 您可以使用类似registry::get->fruits;的方法获取ORM对象;。 GetterObject将检查对象的注册表数组以查找对象。 GetterObject将返回自身的一个新实例,其中包含一些额外的变量,这些变量定义了您所处的步骤;类似于$this->path=/fruits/;。 现在,当您获得第二个对象时,比如Registery::get->fruits->apples;,GetterObject将简单地检查最后一个$this->path片段,它将依赖它来查找子元素。请注意,此步骤在很大程度上取决于您如何构造自己的ORM对象数组。 GetterObject将重复第4步和第5步,直到您得到想要的对象并执行->return\u values;它是一个已定义的函数,返回您正在查找的实际ORM对象,而不是用于在ORM对象中导航的GetterObject。
作为一个小提示,这可能不是所有基于注册表的平台的最佳实践,因此,在这样做之前,请确保您确实需要一些如此复杂的东西。否则,一个简单的get定义可能会满足您的所有需求。祝你好运。

你有没有考虑过使用laravel eloquent@迈克尔:我不知道雄辩。这个框架和任何其他框架的问题是,我在我的方法中投入了大量的工作,实际上现在就想使用它。因此,我宁愿使用自己的解决方案,也不愿使用一个完整的框架。这就引出了一个问题,在我的方法中需要修正什么好的,我可以得到,因为我认为浪费了时间。但是厕所
国王在你所写的,从维护性和未来更新的观点,我强烈建议你考虑重新开始雄辩。它做你想要的,而且更多,更多。你基本上是在重新发明一个发明了多次的轮子。“但这是你的选择。”迈克尔德比茨当然,但作为一名信息学学生,我将从自己做这件事中学到很多东西。下一个项目,我会使用像雄辩现在我知道它的东西。用雄辩的语言替换当前的控制器和逻辑只会浪费数千行代码的大量时间。修复我的eloquent精简版的最佳方法是什么?尝试查看收藏库。您还可以制作半桌状结构。有一个数组是数值数组,0>任意长度。然后还有其他引用数值数组中的值的关联数组(&O)。在seek函数中使用这些函数。您仍然需要解决多个重复密钥的问题。。。我真的会使用雄辩或类似的文库。谢谢你的回答,但你的注册方法听起来比我简单的方法复杂得多。你实际上是在做一些简单的事情,而我只是存储一些东西来防止重复查询。是的,我需要这样做,因为实际上一个$field对象在一次加载中可以在整个webproject中使用100次,我需要防止那些99个冗余调用。我猜从两个给定的答案来看,我将继续我的第一个想法:抛弃真正的可链接性,只存储简单的ID,我以后可以使用它从注册表中获取真正的对象。好吧,当我处理我的项目时,我的方法是我唯一的选择,因为我当时有类似路径的链接,而不知道我在处理什么项目,因为它们是通过编程方式添加的。祝你走运!