使用PHP的__get和__set方法自动使用getter和setter?

时间:2011-06-03 01:22:35

标签: php

我正在尝试构建一个我的所有类扩展的基类,允许通过简单的$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模式而异,如果有一个优雅简单的解决方案,它会很可爱。

1 个答案:

答案 0 :(得分:1)

试试这个,

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