一尘不染

您可以在PHP中动态创建实例属性吗?

php

有没有办法动态创建所有实例属性?例如,我想能够产生在构造函数中的所有属性,仍然能够访问它们的类实例化这样的后:$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;

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


阅读 230

收藏
2020-05-26

共1个答案

一尘不染

有点。有一些魔术方法可以让您连接自己的代码以在运行时实现类行为:

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

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

这称为重载
http://php.net/manual/en/language.oop5.overloading.php

2020-05-26