访问对象属性是一个数字

时间:2018-07-24 07:55:21

标签: php

我有对象:

object(stdClass)#6 (4) { 
        [0]=> object(stdClass)#3 (2) { 
                ["name"]=> string(3) "Jan" 
                ["job"]=> string(2) "IT" 
            } 
        [1]=> object(stdClass)#2 (2) { 
                ["name"]=> string(4) "Adam" 
                ["job"]=> string(2) "PR" 
            } 
        [2]=> object(stdClass)#4 (2) { 
                ["name"]=> string(6) "Wojtek" 
                ["job"]=> string(2) "IT" 
            } 
        [3]=> object(stdClass)#5 (2) { 
                ["name"]=> string(6) "Marcin"
                ["job"]=> string(3) "Car" 
            }
    } 

我的问题是:如何使用该对象:

object(stdClass)#3 (2) { 
        ["name"]=> string(3) "Jan" 
        ["job"]=> string(2) "IT" 
    }

该对象在类中。

类似这样的事情:$this->object->object$this->object->0不起作用。

但是当我将索引号从“ 0”或“ 1”更改为“ A”或“ B”时,

2 个答案:

答案 0 :(得分:0)

您可以使用以下代码将多个数组转换为对象:

$obj1 = (object) ['name' => 'Jan', 'job' => 'IT'];
$obj2 = (object) ['name' => 'Adam', 'job' => 'PR'];
$obj3 = (object) ['name'=> 'Wojtek', 'job' => 'IT'];
$obj4 = (object) ['name' => 'Marcin', 'job' => 'Car'];
$obj = (object) [$obj1, $obj2, $obj3, $obj4];

要获取第一个对象的name,可以将该对象转换为数组(PHP <7.2解决方案):

echo ((array) $obj)[0]->name; // Jan
echo ((array) $obj)[1]->name; // Adam

从PHP 7.2开始,您还可以访问数字属性名称:

echo $obj->{0}->name; // Jan
echo $obj->{1}->name; // Adam

完整示例(包含演示):

$obj1 = (object) ['name' => 'Jan', 'job' => 'IT'];
$obj2 = (object) ['name' => 'Adam', 'job' => 'PR'];
$obj3 = (object) ['name'=> 'Wojtek', 'job' => 'IT'];
$obj4 = (object) ['name' => 'Marcin', 'job' => 'Car'];
$obj = (object) [$obj1, $obj2, $obj3, $obj4];

//your output
var_dump($obj);

//PHP < 7.2: get the output of the name of the first object.
echo 'Test: '.((array) $obj)[0]->name; // Jan

//or since PHP 7.2
echo $obj->{0}->name; // Jan
  

演示: https://3v4l.org/kIVuS

答案 1 :(得分:0)

名称为数字的对象属性实际上是无效的。可以通过某些操作创建它们是一个长期存在的错误。

此错误最终在PHP 7.2中修复; 7.2.0 changelog列出了此更改所修复的几个错误报告,并链接到the RFC which proposed the new behaviour

您可以看到区别in this demo

$obj = (object)[1,2,3];

var_dump($obj);
var_dump($obj->{"0"});

在PHP 7.2之前,这会产生一个与您拥有的对象类似的对象,并且无法访问该属性:

object(stdClass)#1 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

Notice: Undefined property: stdClass::$0 in /in/tfbH0 on line 6
NULL

在7.2之后,它会产生一个完全不同的对象,其中的属性名称都是字符串,而不是整数,并且可以使用->{"name"}语法进行访问:

object(stdClass)#1 (3) {
  ["0"]=>
  int(1)
  ["1"]=>
  int(2)
  ["2"]=>
  int(3)
}
int(1)

如果您无法升级PHP,我所知道的唯一解决方法是:

  • 不要将带有数字键的数组转换为对象;只是将它们保留为数组即可。
  • 如果您无法控制通过代码传递此类对象,请使用(array)$object将其强制转换回数组。