通过getter创建PHP动态变量

时间:2014-04-13 07:50:34

标签: php dynamic reflection

所以我正在使用bag类,我正在尝试从bag类中动态创建变量。

这就是我所拥有的:

class BagFoo
{
    public $a;
    public $b;
    public $c;
}
class Bar
{
    private $bagFoo;
    public function output()
    {
        foreach($this->bagFoo as $key => $value)
        {
            $$key = $value;
        }
        //output then happens here.
    }
}

这允许我调用$ a而不是我喜欢的$this->bagFoo->getA();,但问题是我必须公开成员变量来实现它。我想拥有相同的动态变量赋值,但是通过getter访问成员变量,而不是直接访问。

解决方案我虽然并不喜欢:

  1. getVars()中有一个BagFoo函数,它将返回一个var名称及其值的数组,然后迭代它。
  2. 调用get_class_methods()然后解析并迭代getter(ew)。
  3. 我确信有一种方法可以用更优雅的形式做我正在尝试的事情,但我想不出如何实现它。

1 个答案:

答案 0 :(得分:0)

如果您只使用关联数组来存储值,那么您的代码可能会更容易理解。

class Bar
{
    private $bagFoo = [];
    public function __construct($arr)
    {
        $this->bagFoo = $arr;

        foreach($arr as $key => $value)
        {
            $$key = $value;
        }
        echo $a; //echos 'aaaa'
    }
}
$bar = new Bar([
    'a' => 'aaaa',
    'b' => 'bbbb',
    'c' => 'cccc'
]);

建议提示:使用$$ 要非常小心,因为您可以覆盖当前范围中的变量并导致应用程序中出现各种问题。例如:

$bar = new Bar([
    '_SERVER' => 'broken server vars!',
    '_COOKIE' => 'broken cookies!',
    'arr' => 'broken iterator!',
]);