Manual says:
"[PHP version] 5.0.0 The $GLOBALS variable is included in the results of the array returned."
In php 4.4.7 on WinXP, $GLOBALS variable is included in the results too.
get_defined_vars
(PHP 4 >= 4.0.4, PHP 5)
get_defined_vars — 全ての定義済の変数を配列で返す
説明
array get_defined_vars ( void )この関数は、環境変数、サーバ変数、get_defined_vars() がコールされたスコープ内でユーザが定義した変数を含む、全ての の定義済の変数のリストを有する多次元の配列を返します。
返り値
すべての変数を含む多次元の配列を返します。
例
例 2568. get_defined_vars() の例
<?php
$b = array(1, 1, 2, 3, 5, 8);
$arr = get_defined_vars();
// $b を出力
print_r($arr["b"]);
// PHPインタプリタのパスを出力 (CGIとして使用された場合)
// 例えば、/usr/local/bin/php
echo $arr["_"];
// コマンドラインパラメータがある場合に出力
print_r($arr["argv"]);
// サーバ変数を全て表示
print_r($arr["_SERVER"]);
// 変数の配列で利用可能なキーを全て出力
print_r(array_keys(get_defined_vars()));
?>
変更履歴
| バージョン | 説明 |
|---|---|
| 5.0.0 | 返される配列に $GLOBALS 変数が 含まれます。 |
参考
| isset() |
| get_defined_functions() |
| get_defined_constants() |
get_defined_vars
dkrysiak "monkey" o2.pl
16-Aug-2007 06:18
16-Aug-2007 06:18
kailashbadu at hotmail dot com
03-Mar-2007 08:09
03-Mar-2007 08:09
After a fruitless attempt find a built-in function whic did this, I wrote this functions to find out all the variables (well, those I wanted) in current scope and their values. I believe this is going to be handy in debugging.
<?php
/**
* @desc works out the variables in the current scope(from where function was called).
* Returns an array with variable name as key and vaiable value as value
* @param $varList: variables returned by get_defined_vars() in desired scope.
* $excludeList: variables to be excluded from the list.
* @return array
*/
function getDefinedVars($varList, $excludeList)
{
$temp1 = array_values(array_diff(array_keys($varList), $excludeList));
$temp2 = array();
while (list($key, $value) = each($temp1)) {
global $$value;
$temp2[$value] = $$value;
}
return $temp2;
}
/**
* @desc holds the variable that are to be excluded from the list.
* Add or drop new elements as per your preference.
* @var array
*/
$excludeList = array('GLOBALS', '_FILES', '_COOKIE', '_POST', '_GET', 'excludeList');
//some dummy variables; add your own or include a file.
$firstName = 'kailash';
$lastName = 'Badu';
$test = array('Pratistha', 'sanu', 'fuchhi');
//get all variables defined in current scope
$varList = get_defined_vars();
//Time to call the function
print "<pre>";
print_r(getDefinedVars($varList, $excludeList));
print "</pre>";
?>
william at avianhosting dot com
04-Nov-2006 05:41
04-Nov-2006 05:41
In response to sijmen at digitized dot nl and similar questions -- the problem is variable scope. $GLOBALS is used to access variables in the global scope from inside a function -- this is expected behavior, as get_defined_vars(); is supposed to get the -defined- variables -- and by default, variables in the global scope are -not- defined in the function scope. Therefore, if you want the variables from the global scope -- print_r($GLOBALS);.
zabmilenko at hotmail dot com
01-Sep-2006 11:32
01-Sep-2006 11:32
A little gotcha to watch out for:
If you turn off RegisterGlobals and related, then use get_defined_vars(), you may see something like the following:
<?php
Array
(
[GLOBALS] => Array
(
[GLOBALS] => Array
*RECURSION*
[_POST] => Array()
[_GET] => Array()
[_COOKIE] => Array()
[_FILES] => Array()
)
[_POST] => Array()
[_GET] => Array()
[_COOKIE] => Array()
[_FILES] => Array()
)
?>
Notice that $_SERVER isn't there. It seems that php only loads the superglobal $_SERVER if it is used somewhere. You could do this:
<?php
print '<pre>' . htmlspecialchars(print_r(get_defined_vars(), true)) . '</pre>';
print '<pre>' . htmlspecialchars(print_r($_SERVER, true)) . '</pre>';
?>
And then $_SERVER will appear in both lists. I guess it's not really a gotcha, because nothing bad will happen either way, but it's an interesting curiosity nonetheless.
sijmen at digitized dot nl
13-Jul-2004 12:11
13-Jul-2004 12:11
I was wondering what the difference was between get_defined_vars() and the array $GLOBALS. If you call get_defined_vars() not from a function, then there is no difference. But, if you call it from inside a function or class, then it will only return the available variables inside that function/class.
- Sijmen Ruwhof
lbowerh at adelphia dot net
05-Jun-2004 12:19
05-Jun-2004 12:19
Here is a function which generates a debug report for display or email
using get_defined_vars. Great for getting a detailed snapshot without
relying on user input.
<?php
function generateDebugReport($method,$defined_vars,$email="undefined"){
// Function to create a debug report to display or email.
// Usage: generateDebugReport(method,get_defined_vars(),email[optional]);
// Where method is "browser" or "email".
// Create an ignore list for keys returned by 'get_defined_vars'.
// For example, HTTP_POST_VARS, HTTP_GET_VARS and others are
// redundant (same as _POST, _GET)
// Also include vars you want ignored for security reasons - i.e. PHPSESSID.
$ignorelist=array("HTTP_POST_VARS","HTTP_GET_VARS",
"HTTP_COOKIE_VARS","HTTP_SERVER_VARS",
"HTTP_ENV_VARS","HTTP_SESSION_VARS",
"_ENV","PHPSESSID","SESS_DBUSER",
"SESS_DBPASS","HTTP_COOKIE");
$timestamp=date("m/d/y h:m:s");
$message="Debug report created $timestamp\n";
// Get the last SQL error for good measure, where $link is the resource identifier
// for mysql_connect. Comment out or modify for your database or abstraction setup.
global $link;
$sql_error=mysql_error($link);
if($sql_error){
$message.="\nMysql Messages:\n".mysql_error($link);
}
// End MySQL
// Could use a recursive function here. You get the idea ;-)
foreach($defined_vars as $key=>$val){
if(is_array($val) && !in_array($key,$ignorelist) && count($val) > 0){
$message.="\n$key array (key=value):\n";
foreach($val as $subkey=>$subval){
if(!in_array($subkey,$ignorelist) && !is_array($subval)){
$message.=$subkey." = ".$subval."\n";
}
elseif(!in_array($subkey,$ignorelist) && is_array($subval)){
foreach($subval as $subsubkey=>$subsubval){
if(!in_array($subsubkey,$ignorelist)){
$message.=$subsubkey." = ".$subsubval."\n";
}
}
}
}
}
elseif(!is_array($val) && !in_array($key,$ignorelist) && $val){
$message.="\nVariable ".$key." = ".$val."\n";
}
}
if($method=="browser"){
echo nl2br($message);
}
elseif($method=="email"){
if($email=="undefined"){
$email=$_SERVER["SERVER_ADMIN"];
}
$mresult=mail($email,"Debug Report for ".$_ENV["HOSTNAME"]."",$message);
if($mresult==1){
echo "Debug Report sent successfully.\n";
}
else{
echo "Failed to send Debug Report.\n";
}
}
}
?>
Ruben Barkow(mail-> at web dot de)
06-May-2004 09:32
06-May-2004 09:32
this does NOT work:
i tried to find out the name of a variable, that was sent to myfunction($in) with this code:
myfunction($in) {
$e=array_reverse(get_defined_vars());
echo "possible name for the variable in the function call: '";
foreach ($e as $n=>$v){
if ($v===$in) {
echo $n;
break;
}
}
echo"'";
}
but:
get_defined_vars() doesent give back the variables outside of a function.
(the code does work in the main programcode)
php - fw2 - net
30-Dec-2003 08:21
30-Dec-2003 08:21
biyectivo, above, is incorrect, at least as of PHP-4.3.3 which does indeed show variables from included/required files, as, IMO, it should. Very useful for debugging foreign code.
biyectivo at hotmail dot com
08-Jun-2003 08:16
08-Jun-2003 08:16
Thankfully, get_defined_vars() does NOT return variables which are assigned during an include() call. This would be a big security hole. For example:
//---------------------------------------------------------
include("foo.php");
$var1 = "Hi";
$vars = get_defined_vars();
$ks = array_keys($vars);
for ($i=0;$i<sizeof($ks);$i++)
{
echo $ks[$i]." --> ".$vars[$ks[$i]]."< br >";
}
//---------------------------------------------------------
will return all server variables, then
var1 --> Hi
but will NOT return
pwd --> MyPassword
even if inside foo.php there is a line stating
$pwd = "MyPassword";
jgettys at gnuvox dot com
23-Feb-2002 12:09
23-Feb-2002 12:09
Simple routine to convert a get_defined_vars object to XML.
function obj2xml($v, $indent='') {
while (list($key, $val) = each($v)) {
if ($key == '__attr') continue;
// Check for __attr
if (is_object($val->__attr)) {
while (list($key2, $val2) = each($val->__attr)) {
$attr .= " $key2=\"$val2\"";
}
}
else $attr = '';
if (is_array($val) || is_object($val)) {
print("$indent<$key$attr>\n");
obj2xml($val, $indent.' ');
print("$indent</$key>\n");
}
else print("$indent<$key$attr>$val</$key>\n");
}
}
//Example object
$x->name->first = "John";
$x->name->last = "Smith";
$x->arr['Fruit'] = 'Bannana';
$x->arr['Veg'] = 'Carrot';
$y->customer = $x;
$y->customer->__attr->id='176C4';
$z = get_defined_vars();
obj2xml($z['y']);
will output:
<customer id="176C4">
<name>
<first>John</first>
<last>Smith</last>
</name>
<arr>
<Fruit>Bannana</Fruit>
<Veg>Carrot</Veg>
</arr>
</customer>