为了使我的问题更清楚,我将稍微解释一下情况......我正在尝试制作一个简单而强大的 PHP-ORM-tool 。第一个版本(只有25kB的代码)和测试非常有前途,它有例如的延迟加载即可。现在我正在通过例如优化最小化查询数量......
对于延迟加载,我使用Proxy-class。父类的子属性首先是代理。该代理包含一个空对象......
class Parent {
getChild() { ... }
//other code
}
class Child {
getName() { ... }
//other code
}
class Proxy {
$object = false;
public function _query() { /*some code to get the objects*/ }
__call() {
if(!$objects)
$this->_query();
//perform called function on the $object(s)
}
//other code
}
当我们向父母询问孩子时,我们假设它是一个孩子,但事实上它是一个代理人。只要我们不对它做任何事情,我们就不必查询数据库......每当我们问孩子某事(比如getName())时,魔术调用函数就会生效,查询数据库执行新对象上的被调用函数。原理很简单,但在代码中要困难得多......(它还支持对象列表,循环触发器,有数组访问,查询也很复杂,......)
现在的问题如下:
foreach( $parents as $parent ) {
echo $parent->getChild()->getName();
}
foreach循环中的每个调用都会触发对数据库的查询... 我不想要那个!因为我已经知道我想要一份父母名单中的孩子(这至少是人类心灵所说的......)
让我们假设我对相同类型的所有代理有所了解,我想做这样的事情:
class Proxy {
_query() {
## some code to test if the call originates from within a loop ##
//if so: fill all the Proxies of this type with their object(s)
//else fill this Proxy with its object(s)
}
//other code
}
我知道我只是简单地说这个,但这是一般的想法......
debug_backtrace可以给我一个调用函数的方法,但是我想要关于循环结构的信息......(如果可能的话,甚至是原始列表等......)
答案 0 :(得分:2)
为什么不使用像
这样的参数function _query($loop = false)
在循环中调用时,您可以使用_query(true)来告诉函数您处于循环中。
否则,您可以使用内部计数器来计算查询的调用次数。 ;)
答案 1 :(得分:1)
不,就我所知,它无法检测到但是在调用方法no时你总能发送一个参数吗?
答案 2 :(得分:1)
你不能以编程方式,但我能想到的一个hack是在任何循环之前设置一个全局标志变量?
您可以检查调用堆栈,但开销很大。