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,但是它們會根據數據庫模式而有所不同,如果有一個簡單的解決方案,它會很可愛。
如果你想通過你的魔術方法路線的一切,爲什麼定義一個公共的setter? – 2011-06-03 01:26:55
用於像重新映射屬性的東西。例如,如果屬性'token'變爲'private_key',則可以將'get_private_key()'和'set_private_key($ value)'函數映射到'$ this-> token',直到可以遷移數據庫爲止。 – jps 2011-06-03 01:31:11
@zerocrates Setter會像處理浮點數值一樣處理可變內容處理,而在內部表示中則希望使用浮點數後的4位數字對其進行格式化。 – Nemoden 2011-06-03 01:33:13