栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用名称(如整数)访问对象属性?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用名称(如整数)访问对象属性?

已针对PHP 7.2更新

PHP7.2引入了一种行为上的更改,以转换对象和数组类型转换中的数字键,从而解决了这一特殊的不一致问题,并使以下所有示例的行为均符合预期。

少一件值得困惑的事情!


原始答案(适用于7.2.0之前的版本)

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 OKecho $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_depre(json_enpre($myVar), true);$value = $arr['highlighting']['448364']['Data']['0'];

JSON函数有助于对数组进行递归转换,而无需定义任何外部函数。无论看上去多么理想,它都具有选项#2的“ nuke”缺点, 另外还有_一个缺点,即如果对象中有任何字符串,则这些字符串 _必须
以UTF-8编码(这是的要求

json_enpre



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/385838.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号