1

我打算记录对对象某些属性的任何修改。

PHP 有一种神奇的方法__set可以重载任何从对象外部修改(私有)属性的尝试。

但是,这不适用于对象内部。PHP中是否有一种方法可以为任何修改对象的本地属性的调用提供通用的setter函数?


例子:

class Thing
{
  private $data;

  public function editData()
  {
    $this->data = 'edited';
  }

  function __magic($property, $value)
  {
    if ($property === 'data') {
      print 'Data is being edited!';
    }
  }

}

我希望在编辑__magic之前调用该函数。$data

4

2 回答 2

2

您可以像这样使用 __call:

public function __call($name, $args) {
    if(preg_match('/^set_/', $name)) {
       $attr = str_replace('set_', '', $name);
       $this->{$attr} = $args[0];
       if ($attr === 'data') {
          print 'Data is being edited!';
       }
    }
}

在你的构造函数中:

$this->set_data('edited');

编辑

您可以结合使用 __call 和 __set 来使您的功能正常工作。

public function __set($name, $value) {
  $this->{"set_$name"}($value);
}

这将允许您在使用 object 时执行 set_attr $obj->attr = ''

于 2013-07-11T08:51:58.403 回答
2

不,在对象内部,所有属性都是可访问的,不需要魔法方法。但是如果你想为你的属性分配一个函数,你只需要在你的代码中做一点修改:

class Thing
{
  private $data;

  public function editData()
  {
    $this->propertySetter('data', 'edited');
  }

  function propertySetter($property, $value)
  {
    if ($property === 'data') {
      print 'Data is being edited!';
    }
    $this->$property = $value;

  }

}
于 2013-07-11T08:49:32.897 回答