我正在尝试构建一个我的所有类扩展的基类,允许通过简单的$obj->property
语法进行属性访问,但是如果定义了get_property()
或set_property($value)
,那么任何尝试获取或设置该属性通过这些getter和setter路由。
$changed_array
),它可以输出属性的数组,为了某种目的,更改了插入到db更新调用中。
问题出在这个样本中:
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;
}
这样,调用setter,但是它设置的属性是可访问的,因此新值不使用__set
或__get
函数,并且更改的数组不会更新other_var_name作为已更改的属性。
是否存在某种黑客攻击,其他使用类似$this->set('variable', 'value')
之类的东西来实现结果?我只会编写getter和setter,但它们会因db模式而异,如果有一个优雅简单的解决方案,它会很可爱。
答案 0 :(得分:1)
试试这个,
$objects = array("model", "make", "version");
foreach ($objects as $object) {
$getter = "get".ucfirst($object);
if (is_object($iProduct->$getter())) {
echo "getvalue"+$iProduct->$getter()
}