2012-08-27 80 views
0

我有一组类保存数据库的状态。它就像一个微型ORM模式。因此,对于这个解决方案,我在几桌动态属性的类的结构加载,使得类看起来是这样的:动态创建私有变量?

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

所有的属性是公共属性,因为我有这样的设置他们:

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

我”什么d就像这些动态设置的属性一样是私人的。为什么?因为,请不要错过这里的讽刺,我想通过使用__get()和__set()的重载getter/setter让它们再次公开。我们再次回到原因的问题。实际上,“获得”我可以用公共财产罚款,但为了设置我想在应用设置之前应用一些逻辑。这里是我简化的__set()函数,它让你知道我想要实现什么:

public function __set ($property , $value) { 

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

有意义吗?我很高兴通过其他方式解决这个问题,但是如果我只能动态地设置私有实例变量,这看起来像是一种非常优雅的方式。

+0

为什么不使用“真正的”ORM像教条2? http://www.doctrine-project.org/ –

+0

学习曲线。矫枉过正。灵活性。不知道最后一个,但我有一些想法,我想将我的Enum对象分配给可能不支持ORM的属性等。 – ken

回答

0

不要让那些实际属性,它们存储在一个private阵列只有通过魔术方法访问它们:

class ORM { 

    private $fields = array(); 

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

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

} 

它的行为你到底怎么想的那样。

+0

好的建议。我已经做了这个,但现在我遇到了一个问题,这是......我想......当我将一个对象分配给其中一个属性时,我得到一个“未定义的属性:stdClass :: $ ext_tables”。我的猜测是,任何试图获取超出对象图顶层任何位置的东西的尝试都将失败。这听起来是对的还是我只是没有看到什么? – ken