将数组转换为对象允许使用无效的属性名称?

v0i*_*ess 5 php oop

我可能刚刚碰到其中一个"wtf PHP?" 时刻.

根据PHP文档 [Class member variables] are defined by using one of the keywords public, protected, or private, followed by a normal variable declaration.

我认为这意味着属性必须遵循与变量相同的命名约定.也就是说,它不能以整数开头.以下代码确实会导致解析错误:

class Foo {
    public $1st_property;
}
Run Code Online (Sandbox Code Playgroud)

文档还说明何时将数组转换为对象: Arrays convert to an object with properties named by keys, and corresponding values.

所以我试过了

$a['1st_key'] = "Hello, World!";
$o = (object)$a;

print_r($o);
Run Code Online (Sandbox Code Playgroud)

而且1st_key确实是一种财产

stdClass Object
(
    [1st_key] => Hello, World!
)

要点:属性名称以数字开头,该数字不是有效的变量名称(当然,我们可以访问该属性$o->{'1st_key'}).但是,当一个数组被强制转换为一个对象时,无效的变量名可以成为属性名吗?

hak*_*kre 6

这是由演员完成的.从技术上讲,这些名字并非无效.

您需要区别于如何编写(定义)这些名称.如果你写:

$1
Run Code Online (Sandbox Code Playgroud)

这是一个无效的标签.但如果你写

${1}
Run Code Online (Sandbox Code Playgroud)

该标签无效.

这个问题也可能对您有意义:PHP中的数组到对象和对象到数组 - 有趣的行为.