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

时间:2011-11-08 15:45:04

标签: 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;
}

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

所以我试过

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

print_r($o);

1st_key确实是一个属性

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

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

2 个答案:

答案 0 :(得分:6)

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

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

$1

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

${1}

该标签无效。

这个问题也可能对您有意义:Array to Object and Object to Array in PHP - interesting behaviour

答案 1 :(得分:1)

你是对的 - 没有可能创建无效的属性,如:

class Foo {
    public $1st_property;
}

但你可以这样做:

class Foo {
    function __construct() {
        $this->{'1st_property'} = 'default value';
    }

    function get1st_property() {
        return $this->{'1st_property'};
    }

    function set1st_property($value) {
        $this->{'1st_property'} = $value;
    }
}