动态创建私有变量?

时间:2012-08-27 16:00:39

标签: php

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

  • 对象
    • [tbl_name]
      • ATTRIBUTE1
      • attribute2
      • attribute3
    • [tbl_name]
      • ATTRIBUTE1
      • attribute2
      • attribute3

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

$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 );
    }
}

有意义吗?我很乐意以其他方式解决这个问题,但如果我能动态设置私有实例变量,这似乎是一种非常优雅的方式。

1 个答案:

答案 0 :(得分:0)

不要制作这些实际属性,将它们存储在private数组中,只能通过魔术方法访问它们:

class ORM {

    private $fields = array();

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

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

}

它的行为与你想要的完全相同。