【问题标题】:PHP dynamic var from string来自字符串的 PHP 动态 var
【发布时间】:2015-04-11 20:31:56
【问题描述】:

我知道 PHP 动态变量是如何工作的,我知道我可以访问对象属性,例如 $object->{'somethingWith$var'}; 或喜欢$object->$var;

但我尝试完成的是从$object 和字符串$string = 'property->subproperty'; 访问$object->property->subproperty

我试过$object->$string$object->{$string}$object->$$string哈哈哈,都没有用。

有人知道怎么做吗? :)

【问题讨论】:

    标签: php dynamic var


    【解决方案1】:

    没有办法那样做。

    你必须先分配$property = $object->$propertyName,然后访问你想要的变量$property->$subpropertyName

    在您的示例中,字符串property->subproperty 将被视为显然不存在的变量名。

    【讨论】:

    • 好的,感谢您的解释和快速回答,不过我一直在寻找解决方案。另外,我通常可以直接访问 $object->property->subproperty 而无需赋值,或者我没有明白你的意思:)
    【解决方案2】:

    您可以编写简单的函数,如下所示:

    function accessSubproperty($object, $accessString) {
        $parts = explode('->', $accessString);
        $tmp = $object;
        while(count($parts)) {
            $tmp = $tmp->{array_shift($parts)};
        }
        return $tmp;
    }
    

    【讨论】:

    • 谢谢,这是我认为最好的。我宁愿使用下面 nl-x 建议的 foreach 方法,因为我只会使用一次,但想法就在这里,你是第一个。谢谢。
    【解决方案3】:

    它不起作用,因为您通过尝试获得的只是获得$object{'property->subproperty'},这当然与$object->{'property'}->{'subproperty'}不同。

    你可以做的是:

    $ret = $object;
    foreach (explode("->",$string) as $bit)
        $ret = $ret->$bit;
    

    否则你将不得不去丑陋和邪恶的eval()(让downvoting开始):

    eval("return \$object->$string;")
    

    【讨论】:

    • 这对Brabec's answer 的唯一补充是您可以使用eval,由于安全隐患,这确实不是一个好建议。
    • 我很欣赏 foreach 方式,并将使用它。我不依赖 eval 0:) 谢谢
    • @disadb 所以你使用了答案,但接受了另一个答案:)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多