需要了解php对象属性名称与数组键的帮助吗

需要了解php对象属性名称与数组键的帮助吗,php,Php,我在灵活使用PHP对象属性名时遇到了一些问题,类似于数组键 我的理解是数组键可以是任何字符串或整数,例如 $arr = array("crash-me" => "value"); 是有效的键/值对 现在,如果我将其投射到一个对象: $obj = (object) $arr; 我做了什么违法的事,因为钥匙串上的破折号 一个简单的示例显示了我的dilema: <?php error_reporting(-1); $obj = new stdClass; $prop = "crash-

我在灵活使用PHP对象属性名时遇到了一些问题,类似于数组键

我的理解是数组键可以是任何字符串或整数,例如

$arr = array("crash-me" => "value");
是有效的键/值对

现在,如果我将其投射到一个对象:

$obj = (object) $arr;
我做了什么违法的事,因为钥匙串上的破折号

一个简单的示例显示了我的dilema:

<?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;
请注意,如果在将某个对象分配给属性时将其填充到数组中,则一切正常:

$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']]。。。语法,并让解码器使用数组标志


谢谢你的回复

我不确定xdebug是否对非标准属性名有任何问题,但您肯定不想故意使用这样的属性名。这没有道理

如果您打算将对象用于OO目的,那么您将正式声明它们的属性。在这种情况下,完全不可能使用奇怪的属性名称,也没有什么可说的了

如果您不打算将对象用于OO,那么您只需要拥有数组,您可以将$like->this而不是$like['this']索引到其中。虽然第一种形式更短,我自己也更喜欢它,但当使用属性$with->{'squilled-names'}时,它会变得更难看,实际上比数组访问更糟糕。因此,再次强调,这样做没有任何好处

在某些非常特殊的情况下,可能会出现这样的属性名称—例如,如果对象使用其属性的名称作为数据库表中的列名。但即使在这种情况下,在PHP属性名和数据库列名之间添加一个转换层通常也要方便得多,而不是一步一步地与语法斗争


额外的理由:如果一眼还不足以改变你的想法,那么什么都不会。这只是一个特殊的例子,但我们讨论的是PHP。角落案例应该是。。。避免使用。

我不确定xdebug在非标准属性名方面是否有任何问题,但您肯定不想故意使用这样的属性名。这没有道理

如果您打算将对象用于OO目的,那么您将正式声明它们的属性。在这种情况下,完全不可能使用奇怪的属性名称,也没有什么可说的了

如果您不打算将对象用于OO,那么您只需要拥有数组,您可以将$like->this而不是$like['this']索引到其中。虽然第一种形式更短,我自己也更喜欢它,但当使用属性$with->{'squilled-names'}时,它会变得更难看,实际上比数组访问更糟糕。因此,再次强调,这样做没有任何好处

在某些非常特殊的情况下,可能会出现这样的属性名称—例如,如果对象使用其属性的名称作为数据库表中的列名。但即使在这种情况下,在PHP属性名和数据库列名之间添加一个转换层通常也要方便得多,而不是一步一步地与语法斗争


额外的理由:如果一眼还不足以改变你的想法,那么什么都不会。这只是一个特殊的例子,但我们讨论的是PHP。角落案例应该是。。。避免。

为什么要这样使用它?在对象名称中使用破折号有什么好处?有趣的问题顺便说一句。我正在尝试自动代码生成,希望创建动态属性。为什么要这样使用它?在对象名称中使用破折号有什么好处?有趣的问题顺便说一句。我正在尝试自动代码生成,希望创建动态属性。+1“奇怪的属性名称,没什么可说的了。”SimpleXMLElement使用的属性名称可能不是合法的PHP变量名称,但却是合法的XML元素名称。这样做并不总是不合适的,但我不会养成这样的习惯。好吧,我很害怕。我正在尝试一些自动化,并认为可以动态分配属性名
s、 @user1501974:我想你会发现,在这种情况下,仅仅使用数组并没有什么好处。@user1501974,澄清一下,你可以动态分配属性名。我们认为您应该使用数组。至于崩溃,这似乎是一个xdebug问题。+1“奇怪的属性名,没什么可说的了。”SimpleXMLElement使用的属性名可能不是合法的PHP变量名,但却是合法的XML元素名。这样做并不总是不合适的,但我不会养成这样的习惯。好吧,我很害怕。我正在进行一些自动化实验,并认为动态分配属性名是可能的。@user1501974:我想您会发现,在这种情况下,仅仅使用数组并没有什么好处。@user1501974,为了澄清这一点,您可以动态分配属性名。我们认为您应该使用数组。至于崩溃,这似乎是xdebug的问题。
$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;