我可能刚刚碰到其中一个“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'}
访问该属性)。但是,当一个数组被强制转换为一个对象时,无效的变量名可以成为属性名吗?
答案 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;
}
}