【问题标题】:Access object property which is a number访问对象属性,它是一个数字
【发布时间】:2018-12-31 18:21:33
【问题描述】:

我有对象:

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”时,它会起作用

【问题讨论】:

  • 这看起来像this post 所以试试$this->{'0'}->name
  • 试试这个echo $this->variable->{0};
  • 如果从json_decode获取对象,应该考虑使用第二个参数json_decode($json, true)
  • 谢谢,@AlexandrePainchaud,我没有用户数组。 Rendi,你的方法行不通,Philipp,我不使用 json
  • @grzeso 很高兴为您提供帮助

标签: php


【解决方案1】:

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

$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

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

【讨论】:

  • @grzeso - 是的,我看到了(已经更新),但也描述了你是如何获取对象的。
  • 塞巴斯蒂安,感谢您的回答,但我以其他方式创建对象:$obj1 = (object) ['name'=&gt;'Jan','job'=&gt;'IT'];$obj2 = (object) ['name'=&gt;'Adam','job'=&gt;'PR'];$obj3 = (object) ['name'=&gt;'Wojtek','job'=&gt;'IT'];$obj4 = (object) ['name'=&gt;'Marcin','job'=&gt;'Car'];$obj = (object) [$obj1, $obj2, $obj3, $obj4];
  • 塞巴斯蒂安,非常感谢。我同意你的观点,它在 PHP 7.2 上的工作方式不同。我在笔记本电脑上更改了 PHP 版本,它可以工作。
【解决方案2】:

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

这个错误最终在 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 之后,它会生成一个略有不同的对象,其中属性名称都是字符串而不是整数,并且可以使用 -&gt;{"name"} 语法访问:

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

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

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

【讨论】:

  • 感谢您的回答。我不知道这个问题。
猜你喜欢
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
相关资源
最近更新 更多