2011-11-27 26 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

相關問題