2012-05-24 90 views
0

我正在使用PHP重載,而我想要做的是; 當我調用該對象時,它看起來像這樣。如何在PHP中的重載對象中獲取變量名稱?

$obj->person->name->function(); 

爲此,我使用__get和__call函數。他們會是這個樣子:

function __get($field){ 
    return $this; 
} 

不過,我想知道的人,名字的變量名,因爲這可以改變 每當。我試圖這樣做:

function __get($field){ 
    $array[] = $field; 
    return new object($array); 
} 

他們得到保存,但隨着我添加另一行,它只是將它添加到數組。在調用函數後,它不清除 。我試圖在__call清空數組,但是 沒有幫助。我想谷歌這個,但到目前爲止,我運氣不好。

在PHP中是否有一個本地函數?

- TOO MUCH TO READ?到此爲止,剩下的只是更多的解釋 -

然而__call發送陣列和向您發送到處理 功能是真正的另一個類。

原因: 我有一個用於MongoDB的類5個程序員,我們正在改變 從MongoDB的大量代碼庫到另一個數據庫。通過這個修復,我們可以一次更改整個代碼庫的數據庫 ,而不用花費太多的構建查詢的麻煩。我們只需 在函數類中執行查詢。 (當調用__call時訪問)。然而,一個典型的 線爲DB查詢看起來今天這個樣子:

$this->db->accounts->update(<array>); 

這條線連接到一個數據庫,它連接到該帳戶數據庫中。 但是,我們有一些「特殊」變量,比如$ core。它看起來像這樣:

$this->db->core->accounts->update(<array>); 

那一個不連接到同一個數據庫。

我們需要的是能夠在對象內部構建一系列對象,這是動態的。它需要找到名稱是什麼,所以我們可以把它們放在querys中。只適用於一條線,不是全部。它基本上是基於密鑰的數據庫上基於文檔的基礎設施,具有很多黑客攻擊。 :-D

非常感謝!

回答

0

您需要在訪問屬性時返回不同的對象。

class TempObj{ 
    public $table; 

    public $db; 

    public function __call($name,$arguments){ 
    switch($name){ 
     case "update": 
     $this->db->query("UPDATE ......"); 
     break; 
    } 
    } 
} 

在你DB

public function __get($name){ 
    $obj = new TempObj; 
    $obj->table = $name; 
    $obj->db =& $this; 
    return $obj; 
} 

這樣,當你做$this->db->accounts它會回報你,它可以處理此重載屬性__call方法的對象。

+0

問題在於賬戶也是動態的。所以,它也可以是'$ this-> db-> google-> accounts-> update()''。我現在使用'__call'。 –

+0

這個'accounts'是什麼意思?我相信這是表 – Broncha

+0

是的,這是表。所以在函數中我們需要知道是什麼。如果它的「accounts」,我們需要一個表示它是「accounts」的變量,如果它的'google'我們需要一個表示它是'google'的變量。而且這個電話可以只要它想要。例如:'$ this-> db-> whatever-> every-> dowhatever-> when-> function-> says-> hello()'。基本上,我們需要傳遞'whatever','when','dowhatever','when','function','說''給hello()函數。唯一保持不變的變量是$ this-> db。 –