有没有办法动态创建所有实例属性?例如,我希望能够在构造函数中生成所有属性,并且在类被实例化后仍然能够访问它们: $object->property 。请注意,我想单独访问属性,而不是使用数组;这是我不想要的一个例子:

class Thing {
    public $properties;
    function __construct(array $props=array()) {
        $this->properties = $props;
    }
}
$foo = new Thing(array('bar' => 'baz');
# I don't want to have to do this:
$foo->properties['bar'];
# I want to do this:
//$foo->bar;

更具体地说,当我处理具有大量属性的类时,我希望能够选择数据库中的所有列(代表属性)并从中创建实例属性。每个列值都应存储在单独的实例属性中。

最佳答案

有点。有一些神奇的方法允许您将自己的代码 Hook 以在运行时实现类行为:

class foo {
  public function __get($name) {
    return('dynamic!');
  }
  public function __set($name, $value) {
    $this->internalData[$name] = $value;
  }
}

这是动态 getter 和 setter 方法的示例,它允许您在访问对象属性时执行行为。例如
print(new foo()->someProperty);

在这种情况下,将打印“动态!”并且您还可以为任意命名的属性分配一个值,在这种情况下 __set() 方法会被静默调用。 __call($name, $params) 方法对对象方法调用执行相同的操作。在特殊情况下非常有用。但大多数时候,你会得到:
class foo {
  public function __construct() {
    foreach(getSomeDataArray() as $k => $value)
      $this->{$k} = $value;
  }
}

...因为大多数情况下,您只需要一次将数组的内容转储到相应命名的类字段中,或者至少在执行路径中非常明确的点。因此,除非您确实需要动态行为,否则请使用最后一个示例为您的对象填充数据。

关于php - 你可以在 PHP 中动态创建实例属性吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/829823/

10-15 22:57
查看更多