当前位置: 首页 > 面试题库 >

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

弘思聪
2023-03-14
问题内容

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

在这种情况下将打印“动态”!并且您还可以为任意命名的属性分配一个值,在这种情况下,__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



 类似资料:
  • 本文向大家介绍js中动态创建json,动态为json添加属性、属性值的实例,包括了js中动态创建json,动态为json添加属性、属性值的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 在js中,一个[]认为是数组;{}认为是Json对象; var json = {}; 定义一个Json对象; 为Json对象赋值: json[aa] = "xx"; eval 解析json报错 提示缺少“

  • 问题内容: 是否可以定义PHP类的属性并使用同一类中的属性动态分配值?就像是: 产量: 解析错误:语法错误,第6行出现意外的’$ this’(T_VARIABLE) 上面的代码有什么问题吗?如果是这样,请指导我,如果不可能,那么实现此目的的最佳方法是什么? 问题答案: 您可以像这样将其放入构造函数中: 您为什么不能按照自己的方式去做?手册中的引言对此进行了解释: 该声明可以包括一个初始化,但是此

  • 问题内容: 我想在PHP中创建一个静态类,并使其行为像在C#中一样,所以 在第一次调用类时会自动调用构造函数 无需实例化 这种东西… 问题答案: 您可以在PHP中拥有静态类,但它们不会自动调用构造函数(如果尝试调用,则会收到错误)。 因此,您必须创建一个函数并在每个方法中调用它:

  • 问题内容: 让我们考虑以下情况。有一个,有一个。子窗格将添加到父窗格。考虑到可以动态地添加和删除子窗格而没有任何限制和顺序的情况下,如何才能仅在可见子窗格的情况下使parentPane可见。当然childPane的可见状态也可以随时更改。是否可以创建动态Bindings.OR,以便我可以动态向其添加/删除子可见属性?如果是,那怎么办?如果没有,那么在这种情况下使用什么解决方案? 问题答案: 您可以

  • 问题内容: 我需要在声明式管道中启动一组动态测试。为了更好的可视化目的,我想为每个测试创建一个阶段。有办法吗? 创建一个我知道的阶段的唯一方法是: 我已经看到了这个示例,但是我没有使用声明性语法。 问题答案: 使用声明性语法比声明性语法更具灵活性的脚本化语法,即使声明性文档和建议性更多。 例如,可以循环创建阶段:

  • 问题内容: 我有类名称的列表,想动态创建它们的实例。例如: 如何在Python中动态创建该实例?谢谢! 问题答案: 这通常被称为反思或自省。找出类似的问题,这些问题可以回答您要尝试做的事情: Python是否具有与Java类forname等效的名称 您可以使用字符串实例化Python中的类吗