Manual says:
"[PHP version] 5.0.0 The $GLOBALS variable is included in the results of the array returned."
In php 5.2.5 on Centos, $GLOBALS variable is NOT included in the results
get_defined_vars
(PHP 4 >= 4.0.4, PHP 5)
get_defined_vars — Liste toutes les variables définies
Description
array get_defined_vars
( void
)
get_defined_vars() retourne un tableau multidimensionnel contenant la liste de toutes les variables définies, qu'elles soient des variables d'environnement, de serveur ou définies par l'utilisateur dans la portée d'appel de la fonction get_defined_vars().
Valeurs de retour
Un tableau multidimensionnel contenant toutes les variables.
Exemples
Exemple #1 Exemple avec get_defined_vars()
<?php
$b = array(1, 1, 2, 3, 5, 8);
$arr = get_defined_vars();
// Affiche $b
print_r($arr["b"]);
/* Affiche le chemin vers l'interpréteur PHP (Si utilisé en tant que CGI)
* e.g. /usr/local/bin/php */
echo $arr["_"];
// Affiche les paramètres de la ligne de commande s'il y en a
print_r($arr["argv"]);
// Affiche toutes les variables serveur
print_r($arr["_SERVER"]);
// Affiche toutes les clés disponibles du tableau de variables
print_r(array_keys(get_defined_vars()));
?>
Historique
| Version | Description |
|---|---|
| 5.0.0 | La variable $GLOBALS est incluse dans le tableau retourné. |
get_defined_vars
Jon - intel352 ------ gmail
10-Jan-2008 07:33
10-Jan-2008 07:33
dkrysiak "monkey" o2.pl
16-Aug-2007 11:18
16-Aug-2007 11:18
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.
kailashbadu at hotmail dot com
03-Mar-2007 12:09
03-Mar-2007 12: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
03-Nov-2006 09:41
03-Nov-2006 09: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 04:32
01-Sep-2006 04: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 05:11
13-Jul-2004 05: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 05:19
05-Jun-2004 05: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 02:32
06-May-2004 02: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 12:21
30-Dec-2003 12: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 01:16
08-Jun-2003 01: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 04:09
23-Feb-2002 04: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>
