PHP方法可以检测它是否在循环内被调用?

时间:2011-11-27 19:11:13

标签: php orm

  

可能重复:
  Return a loop in function php

为了使我的问题更清楚,我将稍微解释一下情况......我正在尝试制作一个简单而强大的 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可以给我一个调用函数的方法,但是我想要关于循环结构的信息......(如果可能的话,甚至是原始列表等......)

3 个答案:

答案 0 :(得分:2)

为什么不使用像

这样的参数
function _query($loop = false)

在循环中调用时,您可以使用_query(true)来告诉函数您处于循环中。

否则,您可以使用内部计数器来计算查询的调用次数。 ;)

答案 1 :(得分:1)

不,就我所知,它无法检测到但是在调用方法no时你总能发送一个参数吗?

答案 2 :(得分:1)

你不能以编程方式,但我能想到的一个hack是在任何循环之前设置一个全局标志变量?

您可以检查调用堆栈,但开销很大。