0

我有一组保存数据库状态的类。这就像一个微 ORM 模式。因此,对于这个解决方案,我将一些表的结构加载为类的动态属性,以便类看起来像:

  • 目的
    • [tbl_name]
      • 属性1
      • 属性2
      • 属性3
    • [tbl_name]
      • 属性1
      • 属性2
      • 属性3

所有属性都是公共属性,因为我使用以下内容设置它们:

$object->{$table_name}->{$attribute} = 'foobar';

我想要的是这些动态设置的属性是私有的。为什么?好吧,因为,请不要错过这里的讽刺意味,我想通过使用 __get() 和 __set() 的重载 getter/setter 再次将它们公开。我们再次回到为什么的问题。实际上,对于“获取”,我对公共属性会很好,但是对于设置,我想在允许设置之前应用一些逻辑。这是我简化的 __set() 函数,它让您了解我想要实现的目标:

public function __set ( $property , $value ) {

    if ( !in_array ($property , $blocked_properties) ) {
        $this->property = $value;
        $this->trigger_event ( $property );
    }
}

有道理?我很高兴以其他方式解决这个问题,但如果我可以动态设置私有实例变量,这似乎是一种非常优雅的方式。

4

1 回答 1

0

不要创建这些实际属性,将它们存储在private数组中并仅通过魔术方法访问它们:

class ORM {

    private $fields = array();

    public function __get($name) {
        return $this->fields[$name];
    }

    public function __set($name, $value) {
        $this->fields[$name] = $value;
    }

}

它的行为完全符合您的要求。

于 2012-08-27T16:06:09.573 回答