在PHP中动态声明类/对象内的变量时遇到问题。
我有一个名为Column的类,它接收一个未知长度的(名称=>值(的关联数组。
我需要类变量的名称与数组中的名称完全相同(并且它们的值明显匹配(。
由于Variable Variables方法有点令人困惑,所以当您在它上面添加类/对象声明语法时,我觉得我有点迷失了方向。
我试过这样的东西:
function __construct($array)
{
foreach ($array as $key => $value)
{
$this->$key;
$this->key=$value;
}
}
我通常不会做这个
$this->$key;
我认为$this->key
符合语法,但显然我错了。如果有人能帮我纠正错误,那将非常有帮助。
只需使用{}语法:
function __construct($array)
{
foreach ($array as $key => $value)
{
$this->{$key} = $value;
}
}
而不是
$this->$key;
$this->key=$value;
应该是
$this->$key=$value;
有什么区别
变量属性$this->$key;
作为单个语句访问$key
中名称为的属性,但不对其执行任何操作。但是,如果以前未声明或动态分配该属性,它将触发一个通知未定义属性。
$this->key
访问文字key
属性,如果已显式声明,则为public $key;
。
$this->$key
使用存储在$key
中的名称访问属性。因此,如果$key === 'foo'
,它与$this->foo
相同。
动态分配以前未声明的属性与使用变量属性无关。因此,如果属性$foo
不存在,则$this->foo = 1
与具有$key === 'foo'
的$this->$key = 1
相同。两者都在当前对象上创建一个公共属性$foo
。
特殊情况
如果$key
不是字符串,则它将被强制转换为字符串。如果它是一个无法转换为字符串的对象或资源,则会出现无法转换为string错误。
如果$key
转换为空字符串,则会出现无法访问空属性错误。
如果$key
以数字开头或包含变量名中通常不允许使用的特殊字符(如$
(,则无论如何都会创建该属性。如果使用{}
将任意表达式用作属性名称,则总是可以访问具有类似名称的属性。试试这个:
$o = new stdclass;
$o->{'!"§$%'} = 'it works';
echo $o->{'!"§$%'};