我在以灵活的方式使用 PHP 对象属性名称时遇到了一些麻烦,类似于数组键。
我的理解是数组键可以是任何字符串或整数,例如
$arr = array("crash-me" => "value");
是一个有效的键/值对。
现在,如果我将其“投射”到一个对象:
$obj = (object) $arr;
由于密钥字符串中的破折号,我做了什么非法的事情吗?
一个简单的例子说明了我的困境:
<?php
error_reporting(-1);
$obj = new stdClass;
$prop = "crash-me";
$arr = array();
$obj->$prop = "no crash";
$obj->$prop = $arr; // bp here and $obj->$prop is correct
print_r($obj); // bp here, inspect $obj->$prop and... xdebug/php will crash.
exit;
当您在 print_r() 之前检查 $obj 的值时,这将使用 xdebug 使 eclipse-pdt 崩溃。
但是,如果没有 bp,则在退出时从 print_r() 正确打印内容。
stdClass Object ( [crash-me] => Array ( ) )
请注意,如果我在将某些内容分配给属性时将其填充到数组中,则一切正常:
$obj = new stdClass;
$prop = "crash-me";
$arr = array("works_ok");
$obj->$prop = "no crash";
$obj->$prop = $arr;
print_r($obj);
exit;
底线,我想使用带有破折号的属性名称,可能还有其他类似于数组键的标点符号。是否可以?或者我是否通过分配一个空数组来做非法的事情,在这种情况下不会捕获错误?
提前感谢您的考虑!
在编辑时,我忘记了谜题的另一部分 - 下面的代码不会崩溃。在这种情况下,属性名称没有破折号,但是数组键为空!
$obj = new stdClass;
$prop = "crash_me"; // note underscore
$arr = array();
$obj->$prop = "no crash";
$obj->$prop = $arr; // bp here and $obj->$prop is correct
print_r($obj); // bp here, inspect $obj->$prop and... no crash!
exit;
对困惑感到抱歉!这可能是我想念的明显东西。
在第二次编辑-
为了澄清,我希望从 json_decode() 读取属性名称并简单地使用对象而无需转换为数组。这是一个使用 json 数据文件中的键进行动态代码生成的实验。根据下面的讨论,看起来如果我想继续使用 PHP,我需要 $arr['key1']['key2']... 语法并让解码器使用“array”标志。
感谢您的精彩回复!