2011-11-27 88 views
1

可能重复:
Return a loop in function phpPHP方法可以检测它是否在循环中被调用吗?

为了使我的问题更加明确,我会解释的情况有点...我试图做一个简单但功能强大的PHP -ORM-tool。第一个版本(只有25kB的代码)和测试非常有前途,它有延迟加载。现在我正在通过例如尽量减少查询的数量,...

对于延迟加载,我使用一个代理类。父母级的子女财产最初是代理人。该代理包含一个空的对象...

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 
} 

我知道我simplyfying这一点,但这是一般的想法...

debug_backtrace能给我从一个函数被调用的方法,但是我想要的信息在环路结构上...(如果可能的话甚至包括原始列表等等)

回答

2

为什么不直接使用参数一样

function _query($loop = false) 

在一个循环中,你可以使用_query(真)调用的时候,告诉你是在一个循环的功能。

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

+0

有关ORM的一个大想法是,使用它的程序员不需要知道底层机制和性能指标。他不会自己调用_query函数,它会被orm系统调用! – Stivni

+0

然后你应该使用一个内部计数器。在调用函数时增加它 - 将查询保存在一个临时变量中,以检查是否多次调用相同的查询。 –

1

不,它不能检测到,据我所知,但你总是可以发送一个参数,当调用方法没有?

+0

正如我向Daniel Jager解释的那样,我无法用参数调用它,因为ORM用户不知道他正在使用代理而不是真正的孩子! – Stivni

1

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

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

+0

比尔,我想你明白了......你在说什么大小的开销?查询父母名单中的每个孩子也是开销很大,我认为... – Stivni

+0

坦率地说,该功能只应用于发生异常/错误/调试时。我个人不会将它用于任何网站,但是,@Daniel Jager的额外参数理念可能是一个更好的主意。 – Bill

+1

我不能不同意......我也是那种程序员 - 纯粹主义者,用事物来表达他们的意图。从这个角度来看,我想要一个不会干扰模型的ORM。我需要一个完整的问题分离......谢谢! – Stivni

相关问题