如何动态编写PHP对象属性名称?

use*_*182 61 php

我的代码中有对象属性,如下所示:

$obj ->field_name_cars[0];
$obj ->field_name_clothes[0];
Run Code Online (Sandbox Code Playgroud)

问题是我有100个字段名称,需要动态编写属性名称.否则,对象名称和属性的键将始终相同.所以我尝试过:

$obj -> $field[0];
Run Code Online (Sandbox Code Playgroud)

希望动态更改属性的名称并访问正确的值.但是,我继续在stdClass :: $字段中获取'undefined property $ field;

或多或少我尝试在执行之前动态编写php,以便它可以输出正确的值.关于如何处理这个问题的想法?

Jon*_*Jon 165

PHP 7.0的更新

PHP 7引入了在解析器级别处理间接变量和属性的方式的更改(有关更多详细信息,请参阅相应的RFC).这使实际行为更接近预期,并且意味着在这种情况下$obj->$field[0]将产生预期结果.

如果不希望(现在改进的)默认行为,仍然可以使用花括号来覆盖它,如下所示.

原始答案

写这样的访问:

$obj->{$field}[0]
Run Code Online (Sandbox Code Playgroud)

每当由于变量变量而存在歧义时,这种"用括号括起来"技巧在PHP中很有用.

考虑初始代码$obj->$field[0]- 这是否意味着"访问名称以$field[0]" 为单位的属性,或者"使用0名称在$field"?中给出的属性的密钥访问元素?大括号允许你明确.


Mik*_*ant 24

我认为你正在寻找变量类型表示法,当从其他数组/对象访问值时,最好使用如下的大括号语法:

$obj->{field[0]}
Run Code Online (Sandbox Code Playgroud)


Jvd*_*erg 9

神奇的方法__get是你的朋友:

class MyClass
{
   private $field = array();

   public function __get($name)
   {
      if(isset($this->field[$name]))
        return $this->field[$name];
      else
        throw new Exception("$name dow not exists");
   }
}
Run Code Online (Sandbox Code Playgroud)

用法:

$myobj = new MyClass();
echo $myobj->myprop;
Run Code Online (Sandbox Code Playgroud)

说明:所有字段数据都存储在数组中.当您访问$myobj->myprop该属性时,该类中显然不存在.这__get就是所谓的地方.__getfield数组中查找名称并返回正确的值.

  • 不要这样做.__get函数是性能损耗,除了在创建一些意外行为的严重问题之外,你应该尽可能避免使用它们.这个例子特别可怕,因为如果开发人员没有计划访问不存在的属性来抛出异常,将简单的属性访问转变为潜在的致命错误,它会引发异常,这会导致严重的应用程序破坏行为. (3认同)