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

标签 php design-patterns oop class

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

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

This is called overloading http://php.net/manual/en/language.oop5.overloading.php

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

相关文章:

php - 如何连接所有表?

c# - 如何使用异步等待模式初始化对象

java - 在微服务之间共享版本库有什么问题?

java - 继承类型问题: is there a clean solution?

c# - 为什么我们不能在 C# 中重写方法时更改访问修饰符?

php - mysql 日期格式与 php

php - 如何通过前缀分隔php数组项

php - 从另一个域获取 XML 文件到 Mysql 数据库

c# - 在派生类中添加属性

c++ - 类图中B类中A类的对象