【问题标题】:PHP variables variable not displaying if passed as an array or object如果作为数组或对象传递,PHP 变量变量不显示
【发布时间】:2014-12-13 17:48:09
【问题描述】:

这适用于简单的变量。但它显示带有复杂变量的空结果。我在这里错过了什么吗?还是有其他方法。谢谢。

#1. This works with simple variables.
$object = "fruit";
$fruit = "banana";

echo $$object;   // <------------ WORKS :outputs "banana".
echo "\n";
echo ${"fruit"}; // <------------ This outputs "banana".


#2. With complex structure it doesn't. am I missing something here?
echo "\n";
$result = array("node"=> (object)array("id"=>10, "home"=>"earth", ), "count"=>10, "and_so_on"=>true, );
#var_dump($result);

$path = "result['node']->id";
echo "\n";
echo $$path; // <---------- This outputs to blank. Should output "10".

【问题讨论】:

  • 我猜它会搜索一些名为result['node']-&gt;id的变量,当然那个变量不存在(不想说它无效),因此回显为空。
  • 那么,我将如何获得我需要的结果?
  • 您的要求与eval() 函数可以做的非常接近。然而,它仍然不是你想要的。我认为您无法实现这样的动态解析(而且我不确定您为什么要这样做)。如果我们可以解析该字符串以将表达式评估为某个 assignable 结果,那么它将使 eval() 变得多余(或不那么强大)。
  • +1 用于 eval()。请参阅下面的答案
  • 有一个类似问题的答案。检查这个stackoverflow.com/questions/2036547/…

标签: php arrays variables object


【解决方案1】:

来自php.net's page on variable variables

变量变量获取变量的值并将其视为变量的名称。

问题在于result['node']-&gt;id 不是变量。 result 是变量。如果您打开 PHP 通知的错误报告,您将在输出中看到以下内容:

PHP 注意:未定义变量:result['node']->id ...

可以这样解决:

$path = "result";
echo "\n";
echo ${$path}['node']->id;

$path 周围的花括号是必需的。

为了在数组中使用可变变量,你必须解决一个 歧义问题。也就是说,如果你写$$a[1],那么解析器需要 知道您是否打算使用 $a[1] 作为变量,或者您是否想要 $$a 作为变量,然后是该变量的[1] 索引。语法 解决这种歧义的方法是:${$a[1]} 对于第一种情况和 ${$a}[1] 第二次。

如果不存在,则声明等价于

${$path['node']->id}

这将导致以下输出:

PHP Warning:  Illegal string offset 'node' in /var/www/html/variable.php on line 18
PHP Notice:  Undefined variable: r in /var/www/html/variable.php on line 18
PHP Notice:  Trying to get property of non-object in /var/www/html/variable.php on line 18

【讨论】:

    【解决方案2】:

    不完全使用变量变量,但如果你想使用变量作为 var 名称,eval 应该可以工作

    $path = "result['node']->id"; eval("echo $".$path.";");

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多