在php中动态声明一个类中的Variable

时间:2015-09-16 12:09:46

标签: php oop foreach constructor dynamically-generated

我在PHP中动态声明类/对象内的变量时遇到了麻烦。

我有一个名为Column的类,它接收一个未知长度的(names =>值)的关联数组。

我需要类变量与数组中的名称完全相同(显然它们的值匹配)。

由于Variable Variables方法有点令人困惑,当你在它上面添加类/对象声明语法时,我觉得我迷失了一些。

我试过这样的事情:

function __construct($array)
    {
        foreach ($array as $key => $value)
        {
            $this->$key;
            $this->key=$value;          
        }
    }

我通常不会这样做

$this->$key;

我认为$this->key符合语法,但显然我错了。如果有人可以帮助纠正我,那将非常有帮助。

2 个答案:

答案 0 :(得分:5)

只需使用{}语法:

function __construct($array)
    {
        foreach ($array as $key => $value)
        {
            $this->{$key} = $value;          
        }
    }

答案 1 :(得分:0)

而不是

$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$this->$key = 1$key === 'foo'相同。两者都在当前对象上创建公共属性$foo

特殊情况

如果$key不是字符串,它将被转换为字符串。如果它是无法转换为字符串的对象或资源,则会出现无法转换为字符串错误。

如果$key转换为空字符串,则会出现无法访问空属性错误。

如果$key以数字开头或包含变量名中通常不允许的特殊字符(如$),则无论如何都会创建该属性。如果使用{}将任意表达式用作属性名称,则始终可以访问具有此类名称的属性。试试这个:

$o = new stdclass;
$o->{'!"§$%'} = 'it works';
echo $o->{'!"§$%'};