列出所有的PHP变量

64

是否有可能在PHP脚本中转储所有全局变量? 假设这是我的代码:

<?php
$foo = 1;
$bar = "2";
include("blah.php");
dumpall();
// displays $foo, $bar and all variables created by blah.php

还有,是否可能在PHP脚本中转储所有已定义的常量。

2个回答

107

9
使用get_defined_constants函数获取常量。 - Long Ears
$nico:这对于在eval()内创建的变量也适用吗? - Salman A
3
只要在执行eval()之后调用get_defined_vars()/get_defined_constants(),那就可以。 - Lienau
2
只针对那些想要将以下代码复制/粘贴到一行中的人:echo "<pre>"; print_r(get_defined_vars()); die; 复制你需要的任何部分即可。 - JaseC

14
当进行调试时,尝试使用诸如WinMerge(免费软件)这样的程序查找差异以查看各种数组和变量具有何种差异时,您将需要使用ksort(),否则您将会得到许多错误的负面结果。同时,使用HTML的pre元素进行可视化格式处理也会有所帮助...
<?php
$everything = get_defined_vars();
ksort($everything);

?>
编辑:我不得不回来,发现有一个更好的答案, $GLOBALS
$a = print_r(var_dump($GLOBALS),1);
echo '<pre>';
echo htmlspecialchars($a);
echo '</pre>';

编辑 2:正如mpag提到的那样,如果您正在使用大量软件,则print_r()可能会耗尽内存。假设没有输出或者它明显被截断并且您可以访问php.ini文件,则可以像这样调整内存用法:adjust the memory

ini_set('memory_limit', '1024M');

1
这个答案对我来说非常宝贵。 - quantme
1
三个注释:1)在使用类重的 CMS 时,print_r 会耗尽内存,但是使用 json_encode($GLOBALS) 并用 JavaScript 进行 console.log 可以解决。2)不要忘记 $_ 变量(SERVER、SESSION、ENV、FILES、COOKIE、GET、POST、REQUEST)。3)为了进行更深入的调试,我还会执行 get_declared_classes,然后遍历这些类,使用 get_class_varsget_class_methods 来获取变量和方法。 - mpag
@mpag 哦,是的,我见过一些软件使用了荒谬的内存量;显然的解决方法是不使用这样的系统,但很多人可能没有这个选择,所以希望 https://stackoverflow.com/a/16423653/606371 对他们有用。另外,如果我没记错的话,$_变量应该从$GLOBALS中提取。感谢您的评论,我会尽快查看get_declared_classesget_class_vars。 :-) - John
我已经将我的限制设置为512M,我相信在我的情况下加倍到1024不太可能解决这个问题。我相信2048M是php的硬限制。 - mpag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接