爲了使我的問題更加明確,我會解釋的情況有點...我試圖做一個簡單但功能強大的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
然後你應該使用一個內部計數器。在調用函數時增加它 - 將查詢保存在一個臨時變量中,以檢查是否多次調用相同的查詢。 –