How to display the values ​​of all environment variables in Windows. PHP Variable Scope

Environment variables in Windows contain various information about system settings and the user's environment. A distinction is made between user, system and process environment variables.

The easiest way to view content environment variables in Windows – open system properties ( sysdm.cpl) -> Advanced -> Environment Variables. As you can see, in the window that opens there are two sections: the upper one contains the user’s environment variables, and the lower one contains the system ones.

In addition, environment variables are stored in the system registry. User variables are stored in the . System - in HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment.

You can display the values ​​of all environment variables in command line Windows. The command is simple:

The command will list the environment variables and their values.

In PowerShell, you can use the command to display all environment variables:

If you need to display the value of only one variable, you need to use the echo command, and the variable name must be enclosed in percent signs. For example,

Echo %systemroot%

set > c:\tmp\env_var.txt

Environment variables for a specific process can be obtained using the free Process Explorer utilities(from Sysinternals). Just open the process properties and go to the tab Environment.

13 years ago

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:

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:

print "

" . htmlspecialchars(print_r(get_defined_vars(), true))."
" ;
print "
" . htmlspecialchars (print_r ($_SERVER , true )) . "
" ;
?>

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.

6 years ago

Since get_defined_vars() only gets the variables at the point you call the function, there is a simple way to get the variables defined within the current scope.

// The very top of your php script
$vars = get_defined_vars();

// Now do your stuff
$foo = "foo" ;
$bar = "bar" ;

// Get all the variables defined in current scope
$vars = array_diff(get_defined_vars(), $vars);

echo "

"
;
print_r($vars);
echo "
" ;
?>

15 years ago

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.

function generateDebugReport ($method, $defined_vars, $email = "undefined" )(
// Function to create a debug report to display or email.
// Usage: generateDebugReport(method,get_defined_vars(),email);
// 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";
}
}
}
?>

17 years ago

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\n" );
}
else print(" $indent< $key$attr >$val\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:


John
Smith


Banana
Carrot

11 years ago

As a note, get_defined_vars() does not return a set of variable references (as I hoped). For example:

// define a variable
$my_var = "foo" ;

// get our list of defined variables
$defined_vars = get_defined_vars();

// now try to change the value through the returned array
$defined_vars [ "my_var" ] = "bar" ;

echo $my_var , "\n" ;

?>

will output "foo" (the original value). It"d be nice if get_defined_vars() had an optional argument to make them references, but I imagine its a rather specialized request. You can do it yourself (less conveniently) with something like:

$defined_vars = array();
$var_names = array_keys(get_defined_vars());

foreach ($var_names as $var_name)
{
$defined_vars [ $var_name ] =& $ $var_name ;
}

?>

1 year ago

I posted here before about "this" being in get_defined_vars.

It turns out it"s not always there but in certain cases it will inexplicably appear.

Php -r "
class Test(
public function a() (var_dump(array_keys(get_defined_vars()));$a = 123;)
public function b() (var_dump(array_keys(get_defined_vars()));$this;)
}
$t = new Test();
$t->a();
$t->b();
"

Array()
array("this")

This does not happen in PHP 7.2 but will happen in PHP 5.6.

1 year ago

Some comments here point out that this function wont return references. It does however return names and names are "references".

I would not recommend the suggestions here that convert it to references.

Public function x($a, $b, $c) (
foreach(array_keys(get_defined_vars()) as $key)
if($key !== "this")
$this->y($($key));
}

Public function y(&$input) (
$input++;
}

Instead of $() you can also use $$.

I have done some whacky things in my time to make extremely generic code but I"ve never had to do anything like the above. It might not even work (but should since it"s no different to $a[$key]).

You could also do $$key++ but I"ve never seen code like that which wasn"t horrifically bad (using dynamic where dynamic isn"t beneficial).

If you"re doing something like that then give it additional scrutiny.

This tutorial covers the scope of PHP variables. Explains the difference between local and global scope, shows how to access global variables within a function, how to work with superglobals and create static variables.

When you start learning PHP and start working with functions and objects, variable scope is a bit confusing. Fortunately, PHP's rules in this regard are very easy to understand (compared to other programming languages).

What is scope?

The scope of variables is the context within which the variable was defined and where it can be accessed. PHP has two variable scopes:

  • Global- variables can be accessed anywhere in the script
  • Local- variables can only be accessed inside the function in which they were defined

The scope of a variable, and especially the local one, greatly simplifies code management. If all variables were global, then they could be changed anywhere in the script. This would lead to chaos and large scripts, since very often different parts of the script use variables with the same names. By limiting the scope to the local context, you define the boundaries of the code that can access a variable, which makes the code more robust, modular, and easier to debug.

Variables with global scope are called global, and variables with local scope are called local.

Here is an example of how global and local variables work.

"; ) sayHello(); echo "Value of \$globalName: "$globalName"
"; echo "\$localName value: "$localName"
"; ?>

Hi Harry! $globalName value: "Zoe" $localName value: ""

In this script we created two variables:

  • $globalName- This global variable
  • $localName- This local a variable that is created inside the sayHello() function.

After creating the variable and function, the script calls sayHello(), which prints "Hello Harry!" . The script then tries to output the values ​​of the two variables using the echo function. Here's what happens:

  • Because $globalName was created outside the function, it is available anywhere in the script, so "Zoe" is output.
  • $localName will only be available inside the sayHello() function. Since the echo expression is outside the function, PHP does not provide access to the local variable. Instead, PHP expects the code to create a new variable called $localName , which will have a default value of the empty string. that's why the second call to echo outputs the value "" for the $localName variable.

Accessing global variables inside a function

To access a global variable out of function Simply writing her name is enough. But to access a global variable inside a function, you must first declare the variable as global in the function using the global keyword:

Function myFunction() ( global $globalVariable; // Access the global variable $globalVariable )

If you don't do this, PHP assumes that you are creating or using a local variable.

Here is an example script that uses a global variable inside a function:

"; global $globalName; echo "Hello $globalName!
"; ) sayHello(); ?>

When executed, the script will output:

Hi Harry! Hello Zoya!

The sayHello() function uses the global keyword to declare the $globalName variable to be global. She can then access the variable and output its value (“Zoe”).

What are superglobals?

PHP has a special set of predefined global arrays that contain various information. Such arrays are called superglobals, since they are accessible from anywhere in the script, including internal function space, and do not need to be defined using the global keyword.

Here is a list of superglobals available in PHP version 5.3:

  • $GLOBALS - list of all global variables in the script (excluding superglobals)
  • $_GET - contains a list of all form fields submitted by the browser using a GET request
  • $_POST - contains a list of all form fields sent by the browser using a POST request
  • $_COOKIE - contains a list of all cookies sent by the browser
  • $_REQUEST - contains all key/value combinations that are contained in the $_GET, $_POST, $_COOKIE arrays
  • $_FILES - contains a list of all files downloaded by the browser
  • $_SESSION - allows you to store and use session variables for the current browser
  • $_SERVER - contains information about the server, such as the file name of the script being executed and the IP address of the browser.
  • $_ENV - contains a list of environment variables passed to PHP, such as CGI variables.
For example, you can use $_GET to get the values ​​of variables enclosed in a script's request URL string, and display them on the page:

If you run the above script using the URL http://www.example.com/script.php?yourName=Fred, it will output:

Hello Fred!

Warning! In a real script, such data transfer should never be used due to weak security. You should always validate or filter data.

The superglobal $GLOBALS is very convenient to use because it allows you to organize access to global variables in a function without the need for the global keyword. For example:

"; ) sayHello(); // Prints "Hello, Zoya!" ?>

Static variables: they are around somewhere

When you create a local variable inside a function, it only exists while the function is running. When the function completes, the local variable disappears. When the function is called again, a new local variable is created.

In most cases this works great. Thus, the functions are self-contained and always work the same every time they are called.

However, there are situations where it would be convenient to create a local variable that "remembers" its value between function calls. Such a variable is called static.

To create a static variable in a function, you must use the static keyword before the variable name and be sure to give it an initial value. For example:

Function myFunction() ( static $myVariable = 0; )

Let's consider a situation when it is convenient to use a static variable. Let's say you create a function that, when called, creates a widget and displays the number of widgets already created. You can try writing code like this using a local variable:


"; echo createWidget() . " we have already created.
"; echo createWidget() . " we have already created.>
"; ?>

But, since the $numWidgets variable is created every time the function is called, we will get the following result:

We create some widgets... We have already created 1. We have already created 1. We have already created 1.

But by using a static variable, we can store the value from one function call to another:

"; echo createWidget() . " we have already created.
"; echo createWidget() . " we have already created.
"; echo createWidget() . " >we have already created.
"; ?>

Now the script will produce the expected result:

We create some widgets... We have already created 1. We have already created 2. We have already created 3.

Although a static variable retains its value between function calls, it is only valid while the script is running. Once the script completes execution, all static variables are destroyed, as are local and global variables.

That's all! Please refer to your PHP documentation frequently.

13 years ago

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:

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:

print "

" . htmlspecialchars(print_r(get_defined_vars(), true))."
" ;
print "
" . htmlspecialchars (print_r ($_SERVER , true )) . "
" ;
?>

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.

6 years ago

Since get_defined_vars() only gets the variables at the point you call the function, there is a simple way to get the variables defined within the current scope.

// The very top of your php script
$vars = get_defined_vars();

// Now do your stuff
$foo = "foo" ;
$bar = "bar" ;

// Get all the variables defined in current scope
$vars = array_diff(get_defined_vars(), $vars);

echo "

"
;
print_r($vars);
echo "
" ;
?>

15 years ago

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.

function generateDebugReport ($method, $defined_vars, $email = "undefined" )(
// Function to create a debug report to display or email.
// Usage: generateDebugReport(method,get_defined_vars(),email);
// 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";
}
}
}
?>

17 years ago

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\n" );
}
else print(" $indent< $key$attr >$val\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:


John
Smith


Banana
Carrot

11 years ago

As a note, get_defined_vars() does not return a set of variable references (as I hoped). For example:

// define a variable
$my_var = "foo" ;

// get our list of defined variables
$defined_vars = get_defined_vars();

// now try to change the value through the returned array
$defined_vars [ "my_var" ] = "bar" ;

echo $my_var , "\n" ;

?>

will output "foo" (the original value). It"d be nice if get_defined_vars() had an optional argument to make them references, but I imagine its a rather specialized request. You can do it yourself (less conveniently) with something like:

$defined_vars = array();
$var_names = array_keys(get_defined_vars());

foreach ($var_names as $var_name)
{
$defined_vars [ $var_name ] =& $ $var_name ;
}

?>

1 year ago

I posted here before about "this" being in get_defined_vars.

It turns out it"s not always there but in certain cases it will inexplicably appear.

Php -r "
class Test(
public function a() (var_dump(array_keys(get_defined_vars()));$a = 123;)
public function b() (var_dump(array_keys(get_defined_vars()));$this;)
}
$t = new Test();
$t->a();
$t->b();
"

Array()
array("this")

This does not happen in PHP 7.2 but will happen in PHP 5.6.

1 year ago

Some comments here point out that this function wont return references. It does however return names and names are "references".

I would not recommend the suggestions here that convert it to references.

Public function x($a, $b, $c) (
foreach(array_keys(get_defined_vars()) as $key)
if($key !== "this")
$this->y($($key));
}

Public function y(&$input) (
$input++;
}

Instead of $() you can also use $$.

I have done some whacky things in my time to make extremely generic code but I"ve never had to do anything like the above. It might not even work (but should since it"s no different to $a[$key]).

You could also do $$key++ but I"ve never seen code like that which wasn"t horrifically bad (using dynamic where dynamic isn"t beneficial).

If you"re doing something like that then give it additional scrutiny.

Computer