使用PHP的__get和__set方法自动使用getters和setter?
问题描述:
我想建立一个基类,我所有的类都允许通过简单的$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,但是它们会根据数据库模式而有所不同,如果有一个简单的解决方案,它会很可爱。
答
试试这个,
$objects = array("model", "make", "version");
foreach ($objects as $object) {
$getter = "get".ucfirst($object);
if (is_object($iProduct->$getter())) {
echo "getvalue"+$iProduct->$getter()
}
如果你想通过你的魔术方法路线的一切,为什么定义一个公共的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