php 属性名字访问,如何使用整数等名称访问对象属性?

这篇博客讨论了PHP7.2之前版本中对象和数组转换时数字键的问题,包括无法直接访问以数字开头的属性、大括号语法的适用性以及不同转换方式的差异。提出了手动转换、递归转换和使用JSON函数三种解决方案,并指出了各自的优缺点。文章旨在帮助开发者理解并解决这类问题。
摘要由CSDN通过智能技术生成

更新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_decode(json_encode($myVar), true);$value = $arr['highlighting']['448364']['Data']['0'];

JSON函数有助于执行对数组的递归转换,而无需定义任何外部函数。不管这看起来有多好,它都有选项2的“核子”的缺点。另外缺点是,如果对象中有任何字符串,则这些字符串必在UTF-8中编码(这是json_encode).

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值