2011-06-03 118 views
0

我想建立一個基類,我所有的類都允許通過簡單的$obj->property語法訪問屬性,但是如果定義了get_property()set_property($value),那麼任何獲取或設置該屬性的嘗試都會通過這些getter和setter方法。使用PHP的__get和__set方法自動使用getters和setter?

然而,棘手的部分是我想更新對象屬性以反映在一個數組中(它是對象的一個​​屬性,稱之爲$changed_array),它可以輸出已更改屬性的數組,出於某種目的,例如,插入數據庫更新調用。

問題就出在此示例:

class Sample { 
    private $changed_array; 

    public __get($var_ame){ 
     if(method_exists($this, $method = 'get_' . $var_name)){ 
      return $this->$method(); 
     } else { 
      return $this->$var_name; 
     } 
    } 

    public __set($var_name, $value){ 
     if(method_exists($this, $method = 'set_' . $var_name))} 
      return $this->$method($value); 
     } else { 
      // pseudo code 
      if($this->$var_name isset and isn't $value) { // add to $changed_array } 
      return $this->$var_name = $value; 
     } 
    } 
} 

偉大的工程,直到有像這樣定義的setter方法:

public set_var_name($value){ 
    // pretend we're mapping a db column to another name 
    $this->other_var_name = $value; 
} 

有了這個,設置器調用,但性能也設置是可訪問的,因此新值不使用__set__get函數,並且更改的數組不會使用other_var_name更新爲更改的屬性。

是否有某種黑客,其他使用類似$this->set('variable', 'value')來實現結果?我只會寫getter和setter,但是它們會根據數據庫模式而有所不同,如果有一個簡單的解決方案,它會很可愛。

+0

如果你想通過你的魔術方法路線的一切,爲什麼定義一個公共的setter? – 2011-06-03 01:26:55

+0

用於像重新映射屬性的東西。例如,如果屬性'token'變爲'private_key',則可以將'get_private_key()'和'set_private_key($ value)'函數映射到'$ this-> token',直到可以遷移數據庫爲止。 – jps 2011-06-03 01:31:11

+0

@zerocrates Setter會像處理浮點數值一樣處理可變內容處理,而在內部表示中則希望使用浮點數後的4位數字對其進行格式化。 – Nemoden 2011-06-03 01:33:13

回答

1

試試這個,

$objects = array("model", "make", "version"); 
      foreach ($objects as $object) { 
       $getter = "get".ucfirst($object); 
       if (is_object($iProduct->$getter())) { 
        echo "getvalue"+$iProduct->$getter() 
      } 
相關問題