为了使我的问题更加明确,我会解释的情况有点...我试图做一个简单但功能强大的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能给我从一个函数被调用的方法,但是我想要的信息在环路结构上...(如果可能的话甚至包括原始列表等等)
有关ORM的一个大想法是,使用它的程序员不需要知道底层机制和性能指标。他不会自己调用_query函数,它会被orm系统调用! – Stivni
然后你应该使用一个内部计数器。在调用函数时增加它 - 将查询保存在一个临时变量中,以检查是否多次调用相同的查询。 –