php 属性名字访问,php – 如何访问对象属性的名称,如整数?

PHP有它的黑暗胡同的一部分,你真的不想找到自己里面。名称为数字的对象属性是其中之一…

他们从来没有告诉过你

事实#1:您不能轻易地访问名称不是合法变量名称的属性

$a = array('123' => '123', '123foo' => '123foo');

$o = (object)$a;

echo $o->123foo; // error

事实#2:您可以使用大括号语法访问这些属性

$a = array('123' => '123', '123foo' => '123foo');

$o = (object)$a;

echo $o->{'123foo'}; // OK!

事实#3:但如果属性名称是所有数字,不是!

$a = array('123' => '123', '123foo' => '123foo');

$o = (object)$a;

echo $o->{'123foo'}; // OK!

echo $o->{'123'}; // error!

事实#4:嗯,除非对象不是来自数组在第一位。

$a = array('123' => '123');

$o1 = (object)$a;

$o2 = new stdClass;

$o2->{'123'} = '123'; // setting property is OK

echo $o1->{'123'}; // error!

echo $o2->{'123'}; // works... WTF?

很直观,你不同意吗?

你可以做什么

选项#1:手动

最实用的方法是简单地将感兴趣的对象转换回数组,这将允许您访问属性:

$a = array('123' => '123', '123foo' => '123foo');

$o = (object)$a;

$a = (array)$o;

echo $o->{'123'}; // error!

echo $a['123']; // OK!

不幸的是,这不递归工作。所以在你的情况下,你需要做一些像:

$highlighting = (array)$myVar->highlighting;

$data = (array)$highlighting['448364']->Data;

$value = $data['0']; // at last!

选项#2:核选择

另一种方法是编写一个以递归方式将对象转换为数组的函数:

function recursive_cast_to_array($o) {

$a = (array)$o;

foreach ($a as &$value) {

if (is_object($value)) {

$value = recursive_cast_to_array($value);

}

}

return $a;

}

$arr = recursive_cast_to_array($myVar);

$value = $arr['highlighting']['448364']['Data']['0'];

但是,我不相信这是一个更好的选择,因为它会不必要地将所有的属性,你不感兴趣,以及那些你不必要的数组。

选项#3:玩得聪明

上一个选项的另一种选择是使用内置的JSON函数:

$arr = json_decode(json_encode($myVar), true);

$value = $arr['highlighting']['448364']['Data']['0'];

JSON函数有助于执行向数组的递归转换,而不需要定义任何外部函数。然而,这看起来很可取,它有选项#2的“nuke”缺点,另外缺点是如果你的对象中有任何字符串,这些字符串必须以UTF-8编码(这是json_encode的要求)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值