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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (57)

有没有办法动态创建所有实例属性?例如,我希望能够在构造函数中生成所有属性,并且在类实例化后仍然可以访问它们$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;

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

提问于
用户回答回答于

在运行时实现类的行为:

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

这是动态getter和setter方法的一个例子,它允许你在访问对象属性时执行行为。例如

print(new foo()->someProperty);

在这种情况下将打印“dynamic!” 你也可以为一个任意命名的属性赋值,在这种情况下__set()方法被静默地调用。__call($ name,$ params)方法对于对象方法调用是一样的。在特殊情况下非常有用。但大多数时候,你会得到:

class foo {
  public function __construct() {
    foreach(getSomeDataArray() as $k => $value)
      $this->{$k} = $value;
  }
}
用户回答回答于
class Test
{
    public function __construct($x)
    {
        $this->{$x} = "dynamic";
    }
}

$a = new Test("bar");
print $a->bar;

输出:

dynamic

所以名为“bar”的对象属性是在构造函数中动态创建的。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动