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

时间:2012-09-24 19:03:56

标签: php

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

$obj ->field_name_cars[0];
$obj ->field_name_clothes[0];

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

$obj -> $field[0];

希望动态更改属性的名称并访问正确的值。但是,我一直在stdClass :: $ field中获得'undefined property $ field;

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

8 个答案:

答案 0 :(得分:147)

PHP 7.0的更新

PHP 7在解析器级别引入了changes to how indirect variables and properties are handled(有关详细信息,请参阅corresponding RFC)。这使实际行为更接近预期,并且意味着在这种情况下$obj->$field[0]将产生预期结果。

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

原始答案

按如下方式编写访问权限:

$obj->{$field}[0]

这"用括号括起来"每当因变量变量而出现歧义时,技巧在PHP中都很有用。

考虑初始代码$obj->$field[0] - 这是否意味着"访问其名称在$field[0]"中提供的属性,或者#34;访问带有键的元素{名称在0"中提供的属性的{1}}大括号允许你明确。

答案 1 :(得分:23)

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

$obj->{field[0]}

答案 2 :(得分:8)

魔术方法__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");
   }
}

用法:

$myobj = new MyClass();
echo $myobj->myprop;

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

答案 3 :(得分:1)

今天,我面临着挑战。我最终得到了这种发展风格

$countTickets = new \stdClass;

foreach ($tickets as $key => $value) {

    if(!isset($countTickets->total)){
        $countTickets->total = 0;
    }

    if(!isset($countTickets->{$value['categoryname']})){
        $countTickets->{$value['categoryname']} = 0;
    }

    $countTickets->total += $value['number'];
    $countTickets->{$value['categoryname']} += $value['number']; 
}

答案 4 :(得分:0)

aboulfazl,因为PHP 5.3.3与类同名的方法不会被视为构造函数!

    YourClass
    {
        public $any = false;

        public function __construct($any = null)
        {
            $this->any = (is_null($any) ? $this->any : $any);
        }
    }

这有效,但主题所有者没有问,Jon给了awnser!

答案 5 :(得分:0)

我研究了一些使用动态创建的对象属性的代码。我认为使用动态创建的对象属性非常酷(我认为是正确的)。但是,我的程序需要7秒钟才能运行。我删除了动态对象属性,并将它们替换为声明为每个类的一部分的对象属性(在本例中为public)。 CPU时间从7秒钟以上变为0.177秒。那是相当可观的。

我使用动态对象属性的方式有可能做错了什么。我的配置也可能以某种方式被破坏。当然,我应该说我的计算机上具有非常普通的原始PHP配置。

答案 6 :(得分:-2)

使用PHP默认类Object的实例向其动态分配属性的最佳方法

$inst=new \StdClass;
$inst->any_property = '';

答案 7 :(得分:-6)

继承。 例如:

YourClass extends stdClass {
   public function YourClass() {
      $this->AnyProperty="any";
   }
}

现在AnyProperty已动态声明。