我在灵活地使用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'...语法,并让解码器使用"array“标志。
感谢你的回复!
发布于 2013-02-16 04:01:57
我不确定xdebug对非标准属性名是否有任何问题,但你肯定不想故意使用这样的属性名,这是没有意义的。
如果您打算将对象用于OO目的,那么您需要正式地声明它们的属性。在这种情况下,使用“奇怪的”属性名称是完全不可能的,也没有什么可说的。
如果您不打算将对象用于OO,那么您最终只能拥有数组,您可以在其中对$like->this而不是$like['this']进行索引。虽然第一种形式更短,而且我自己也更喜欢它,但在使用属性$with->{'strange-names'}时,它变得更加丑陋--实际上比数组访问更糟糕。所以,再说一次,这样做没有任何好处。
在某些非常特殊的情况下,可能会出现这样的属性名称--例如,如果一个对象使用其属性的名称作为数据库表中的列名。但是,即使在这种情况下,在PHP属性名和数据库列名之间添加一个转换层通常也要方便得多,而不是一步一步地使用语法。
奖励论点:如果只看一眼this question还不足以改变你的想法,那么什么都不会改变。这只是一个特殊的情况,但我们谈论的是PHP。角落的箱子应该是..。避免了。
https://stackoverflow.com/questions/14902335
复制相似问题