2011-05-21 72 views
3

在创建类,我也跟着OO公约和使用它们之前声明的所有类变量:在PHP中创建动态类变量是个好主意吗?

class myClass { 
     private $property1, $property2, ...; 

     public __constructor() { 
     $this->property1 = $this->property2 = NULL; 
     } 

    } 

但我意识到PHP是脚本语言,而不是下面的面向对象的概念严格,所以我们可以动态'产生阶级属性:

class myClass { 
     public __constructor() { 
     $this->fields = $this->db->getFields(TABLE_NAME); 

     foreach($this->fields as $fld) { 
      $this->{$fld} = NULL; 
     } 
     } 

    } 

这是一个好方法吗? 我认为动态生成的属性默认情况下具有公共访问权限,所以这可能是一个缺点,并且这种自动化可能是一个优点。 性能方面有什么不同吗?

+0

可能重复[为什么在PHP中隐含的财产申报?](http://stackoverflow.com/questions/6027861/why-implicit-property -declaration-in-php) – 2011-05-21 07:47:12

回答

4

你不鼓励这样做,但在某些情况下,你只需要(就像你在编写ORM一样)。类应该有清晰的接口(程序员需要知道他可以怎样处理你的类)。

但有处理这些情况下(至少,对我来说似乎更好)一个更好的办法。在你的类中准备一个关联的数据数组,并使用__get方法。 ORM可能更好(可以实现延迟加载等)。

+1

'但是在某些情况下,你只需要(就像在ORM中一样) - 它绝对是愚蠢的ORM,你需要这样做,并且这个特性是为怪物创建的,__get和__set看起来像属性实现从C#,并且可能是非常有用的,但也不能在界面中(PHP)的说明。 – 2011-05-21 09:00:50

+0

确定,但我认为,如果我们想给在构造函数中的所有属性,__get和__set方法而言非常昂贵。时间 – 2011-06-04 12:48:44

+0

都能跟得上看看这个:https://gist.github.com/1007883 – 2011-06-04 13:03:12

1

这取决于你的情况。当你有直接映射到表(或其他结构)的数据容器时,这是一种常见的做法。在ORM中最常用,因为列是在运行时确定的,并且不需要为每个表定义容器类。

2

如果您正在编写许多用户应该使用的代码(库),那么最好严格定义您的API。这样在实施时就不会出现混乱。但如果您将它用于单个案例,它不会那么糟糕,实际上它可以提供很大的灵活性。

1

这一切都取决于你想如何使用这些公开的变量。例如在像Symfony这样的框架中就可以很好地使用它们。所有动态类变量都可以在模板等类的外部使用。

因此,它可以是一个很好的做法,如果你有创意与他们的