2011-06-03 47 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() 
      } 
相关问题