【问题标题】:Dynamically declaring Variable inside a class in php在php中的类中动态声明变量
【发布时间】:2015-12-13 00:24:59
【问题描述】:

我在 PHP 的类/对象中动态声明变量时遇到问题。

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

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

由于变量变量方法有点混乱,当你在它上面添加类/对象声明语法时,我觉得我有点迷失了。

我尝试过这样的事情:

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

我通常不会这样做

$this->$key;

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

【问题讨论】:

    标签: php oop foreach constructor dynamically-generated


    【解决方案1】:

    只需使用 {} 语法:

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

    【讨论】:

    • 您需要注意将您的非平均待编辑变量名称作为输入发送(如果有的话)。
    【解决方案2】:

    代替

    $this->$key;
    $this->key=$value;          
    

    应该是

    $this->$key=$value;          
    

    有什么区别?

    变量属性$this->$key; 作为单个语句访问名称在$key 中的属性,但不对其进行任何操作。但是如果该属性之前没有被声明或动态分配,它会触发一个通知Undefined property

    $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->{'!"§$%'};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多