在 PHP 中创建动态类变量是个好主意吗?


Is it good idea to create dynamic class variables in PHP?

在创建类时,我遵循了OO约定并在使用它们之前声明了所有类变量:

    class myClass {
      private $property1, $property2, ...;
      public __constructor() {
         $this->property1 = $this->property2 = NULL;
      }
    }

但我意识到PHP是脚本语言,而不是严格遵循OO概念,因此我们可以动态"生成"类属性:

    class myClass {
      public __constructor() {
         $this->fields = $this->db->getFields(TABLE_NAME);
         foreach($this->fields as $fld) {
           $this->{$fld} = NULL;
         }
      }
    }

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

我们不鼓励你这样做,但在某些情况下你只需要这样做(比如在ORM中,你似乎正在写)。类应该有干净的接口(程序员需要知道他可以用你的类做什么)。

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

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

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

这完全取决于您希望如何使用这些公开可用的变量。例如,在像Symfony这样的框架中,可以很好地利用它们。所有动态类变量都可以在模板等中在类外部可用。

因此,如果您对它们有创意,这可能是一个很好的做法