|
get_defined_vars
Returns an array of all defined variables
(PHP 4 >= 4.0.4, PHP 5)
Example 2584. get_defined_vars() Example<?php Code Examples / Notes » get_defined_varsruben barkow mail->
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) biyectivo
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
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> dkrysiak "monkey" o2.pl
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. william
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);.
sijmen
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
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"; } } } ?> php - fw2 - net
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.
kailashbadu
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>"; ?> zabmilenko
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. |
Change Languagedebug_zval_dump doubleval empty floatval get_defined_vars get_resource_type gettype import_request_variables intval is_array is_binary is_bool is_buffer is_callable is_double is_float is_int is_integer is_long is_null is_numeric is_object is_real is_resource is_scalar is_string is_unicode isset print_r serialize settype strval unserialize unset var_dump var_export |