【问题标题】:Getting object value from a string从字符串中获取对象值
【发布时间】:2010-12-23 11:54:01
【问题描述】:

我有一个问题要与大家分享。问题是,我想提取名称存储在字符串变量中的复杂对象的值。

如您所知,您可以执行以下操作:

$foo = 'Hello World';

$var = 'foo';

echo var_dump($$var); // Output: string(11) "Hello World"

当你尝试这样做时,问题就来了:

$data = new stdClass();

$data->param["foo"]["bar"] = 'Hello World';

$var = 'data->param["foo"]["bar"]';

echo var_dump($$var); // Output: NULL    

我可以想象为什么解析器不能这样做。我能想到的唯一解决方法是将 $var 拆分成更小的块('->'、'['、']'、...)并逐步评估它。

有人知道更优雅的解决方案吗?

非常感谢

【问题讨论】:

  • 我认为不可能以这种方式使用 -> 或 [ 之类的元素...
  • “变量变量”只有一个变量变量名。它们不是变量表达式。抱歉,没有更好的解决方法。但是你能详细说明你的用例吗?

标签: php string variables metaprogramming


【解决方案1】:

嗯,data->param["foo"]["bar"] 不是变量名,所以你不能在$$var 中使用它。

在这种情况下你最好使用eval(),像这样

$var = 'return $data->param["foo"]["bar"];';
var_dump(eval($var));

是的,你不需要echo var_dump,只需var_dump

【讨论】:

    【解决方案2】:

    最后我可以通过以下方式解决它:

    <?php
    
    $data = new stdClass();
    
    $data->param["foo"]["bar"] = 'Hello World';
    
    $var = 'data->param["foo"]["bar"]';
    
    $value = eval('return $'.$var.';');
    
    var_dump($value);
    

    【讨论】:

    • 看来你的回答和German Rumm的回答基本一致。如果您不介意,请通过单击帖子旁边的勾号来接受该答案。此外,您实际上并不需要 eval 字符串中的 return
    • 好吧,我通常从不建议使用 eval @Delan Azabani 有一个观点
    • 是的,Hannes,eval 有很多小问题,这些小问题可能会变成大问题,而且效率低下,如果有更好的选择,应该避免使用。我只知道基本的 PHP,所以我真的没有答案可以贡献。
    • @Delan Azabani,如果没有返回,它似乎不起作用(var_dump() 显示NULL),这就是我添加它的原因。
    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2023-01-16
    • 2013-02-04
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多