注册 登录
编程论坛 PHP技术论坛

echo "{${phpinfo()}}" 可以输出php环境信息,何故?

redice 发布于 2010-06-07 20:57, 5548 次点击
程序代码:
<?php
function test($str)
{
  echo $str;
}

test("{${phpinfo()}}");
?>

执行上面的代码,竟然可以显示出phpinfo();打印出的信息,何故?

附:

双引号 里的东西 输入的时候能判断是否 包含 变量,如果包含 变量 就一起输出。 函数怎么也能被执行呢?
15 回复
#2
redice2010-06-07 22:08
没人回复,楼主很生气...
#3
笨笨林2010-06-08 07:39
test("{${phpinfo()}}");
在这里,${phpinfo()}作为参数时,已经不是一个变量了。
在PHP中,变量名是由字母,数字,下划线开始的。所以,就算以 $ 开始,也不能当作变量处理。

可能这个回答有误。会再查相关资料

[ 本帖最后由 笨笨林 于 2010-6-8 07:49 编辑 ]
#4
redice2010-06-08 09:16
回复 3楼 笨笨林
这里与它做不做参数无关,你可以试试 echo "{${phpinfo()}}"
#5
cnenc2010-06-08 10:21
还记得 下面代码吗?

<?php
$name = 'aaa';
$$name= 'bbb';

echo $bbb;
?>

在PHP手册中就有.
#6
cnenc2010-06-08 10:31
<?php
${test()} = 'ccc';

echo $bbb;

function test ()
{
    return 'bbb';
}

?>

运行后的输出值为 'ccc';

个人观点:
PHP 中变量的格式为:  $ + 变量名.
变量名: 变量名是由字母,数字,下划线.
那么,变量名除了直接写出来的 "字母,数字,下划线",
也可以用 变量代替,或者是某函数的返回值. 只要返回值符合 "字母,数字,下划线" 就可以了.

然后, {} 是"块"的意思. 是为了防止PHP 把函数名当作变量名而加上的 "定界符".


${test()}
  =>
$ + {test()}
  =>
$ + bbb
  =>
$bbb


#7
cnenc2010-06-08 10:35
最后, 由于 phpinfo 是个比较特殊的函数.
执行此函数,  PHP 直接输出. 它的返回值是 bool

#8
redice2010-06-08 12:25
回复 6楼 cnenc
程序代码:
function test()
{
    echo "i am run!";
}

echo "{${test()}}";


不对吧,没有返回值的函数没什么也可以呢?  最外面的那两个{}为什么不能去掉呢?
#9
cnenc2010-06-08 14:09

不对吧,没有返回值的函数没什么也可以呢?
======
不是可以不可以的问题.
echo "{${test()}}"; => echo $NULL ;
实际上,运行时会提示  PHP Notice:  Undefined variable:  in xxx.php....

而你看到的输出, 只是 test() 里面的 echo.

#10
cnenc2010-06-08 14:10
修改 echo "{${test()}}";
为   var_dump("{${test()}}");
你是可以知道.
#11
cnenc2010-06-08 14:11
至少最外层的 {} 也是 "定界符" 的作用.
#12
redice2010-06-08 14:16
回复 10楼 cnenc
var_dump("{${test()}}");  和 var_dump("");  返回的是没有区别的  都是 string(0) ""
#13
cnenc2010-06-08 22:19
嗯,你自己分析一下日志.
#14
一叶知秋2010-06-10 22:47
以下是引用cnenc在2010-6-8 10:21:21的发言:

还记得 下面代码吗?

<?php
$name = 'aaa';
$$name= 'bbb';

echo $bbb;   
?>

在PHP手册中就有.


<?php
$name = 'aaa';
$$name= 'bbb';//这里是定义了一个名为aaa的字符串变量,其值为'bbb',相当于$aaa='bbb';

echo $bbb;   //这里是不是有误,应为echoaaa;
?>
#15
cnenc2010-06-14 16:08
以下是引用一叶知秋在2010-6-10 22:47:39的发言:

 
 
$name = 'aaa';
$$name= 'bbb';//这里是定义了一个名为aaa的字符串变量,其值为'bbb',相当于$aaa='bbb';
 
echo $bbb;   //这里是不是有误,应为echoaaa;
?>
确实应该是 echo $aaa;  笔误笔误.

楼上真细心.
#16
vastian2018-05-03 09:50
回复 8楼 redice
复杂(花括号)语法
Note:
函数、方法、静态类变量和类常量只有在 PHP 5 以后才可在 {$} 中使用。然而,只有在该字符串被定义的命名空间中才可以将其值作为变量名来访问。只单一使用花括号 ({}) 无法处理从函数或方法的返回值或者类常量以及类静态变量的值。
http://

程序代码:

function test(){
    echo 'run';
}

var_dump("${test()}"); // 单一花括号 报错提示:only simple expressions are allowed

var_dump("{$test()}"); // 则会先识别test为变量名,$test()=>$test () 未定义的变量test

正确用法:
1:

$test='test';
var_dump("{$test()}");

2:
var_dump("{${test()}}");

1