get_defined_vars

(PHP 4 >= 4.0.4, PHP 5, PHP 7)

get_defined_vars Возвращает массив всех определенных переменных

Описание

array get_defined_vars ( void )

Эта функция возвращает многомерный массив, содержащий список всех определенных переменных, будь то переменные окружения, серверные переменные или переменные, определенные пользователем, в той области видимости, в которой была вызвана get_defined_vars().

Возвращаемые значения

Многомерный массив со всеми переменными.

Примеры

Пример #1 Пример использования get_defined_vars()

<?php
$b 
= array(112358);

$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()));
?>

Смотрите также

  • isset() - Определяет, была ли установлена переменная значением отличным от NULL
  • get_defined_functions() - Возвращает массив всех определённых функций
  • get_defined_constants() - Возвращает ассоциативный массив с именами и значениями всех предопределенных констант

Коментарии

Simple routine to convert a get_defined_vars object to XML.

<?php
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>
2002-02-22 21:09:32
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
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";     
      }
    }
}
?>
2004-06-04 23:19:35
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
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($_SERVERtrue)) . '</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.
2006-08-31 22:32:55
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
Автор:
Here's a very simple function for debugging. It's far from perfect but I find it very handy. It outputs the var value and the var name on a new line. The problem is it'll echo any vars and their name if they share the same value. No big deal when debugging and saves the hassle of writing the HTML and var name when echoing a variable. (ev=echo variable). Using get_defined_vars() inside a function renames the var name to the functions variable so isn't as useful for debugging. Of course, you'll need access to the $GLOBALS array
<?
function ev($variable){
    foreach(
$GLOBALS as $key => $value){
        if(
$variable===$value){
            echo 
'<p>'.$key.' - '.$value.'</p>';
        }
    }
}

$a=0;
ev($a);
$b=0;
ev($b);
$c=0;
ev($c);
?>
Will output
a - 0

a - 0
b - 0

a - 0
b - 0
c - 0
2008-08-21 18:52:03
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
As a note, get_defined_vars() does not return a set of variable references (as I hoped). For example:

<?php

// 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:

<?php

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

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

?>
2008-10-21 12:15:27
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
Автор:
Note that this only returns things you've used. See http://bugs.php.net/bug.php?id=52110 . So don't expect this to have the $this entry, unless you assign $this to return $this.
2010-06-17 11:09:56
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
Автор:
get_defined_vars() returns ALL the vars (in the current scope), what if you just want all YOUR vars, not PHP's super-globals?

<?php
    var_export
(array_diff(get_defined_vars(), array(array())));
?>

Example...

<?php
    $TOP_LEVEL_VAR
=1;
   
var_export(array_diff(get_defined_vars(), array(array())));
?>

The output (with register_globals off) should be...

array (
  'TOP_LEVEL_VAR' => 1,
)

...it perfectly eliminated all the super-globals, without me having to specify them! (note with register_globals on, the output includes those globals, then TOP_LEVEL_VAR).

Here it is, as a function...(it's the best I could do {I can't call get_defined_vars() inside get_user_defined_vars() cuz of the scope issue}).

<?php
    header
('Content-type: text/plain');

   
$TOP_LEVEL_VAR=1;

    echo 
'register_globals(';
    echo 
ini_get('register_globals');
    echo 
') '.phpversion()."\n";

   
var_export(get_user_defined_vars(get_defined_vars()));

    function 
get_user_defined_vars($vars) {
        return 
array_diff($vars, array(array()));
    }
?>

Note that originally I had an array of the super-globals I wanted removed from get_defined_vars()'s array, then I noticed even an empty double-array, array(array()), made it give me the correct result. Weird.

This was tested on PHP 5.2.9.
2011-04-18 08:32:18
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
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.

<?php
// 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 
'<pre>';
print_r($vars);
echo 
'</pre>';
?>
2013-04-02 20:28:15
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
Reference variables are returned by reference (tested on PHP 5.5.11):
<?php
$a 
null;
$b = &$a;
get_defined_vars()['b'] = 4;
var_dump($b); // int(4)
?>
2014-06-01 22:14:58
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
dirty code sample:

print_r(compact(array_keys(get_defined_vars())));
2015-11-14 12:35:19
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
for all those who don't know how to us this function. copy and run this code in your computer  .

note: you need to know what superglobals are.....

<?php

 
$A 
;
$B 10 ;
$C 15 ;
$D 20 ;

$F get_defined_vars($A);

var_dump($F);  //don't use echo. it will show error

?>

Result : will show all superglobals status along with your defined
variables along with its values
2017-05-23 20:37:41
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
Автор:
I occasionally use this as a hack to convert arguments to an array where terseness is needed (dealing with legacy code, etc).

However in an object context it'll also pull in $this.

Make sure to unset it. If you map it to properties or an array then setting the key this wont be an error.

I recommend using a wrapper function that strips this from the result.
2018-04-24 23:20:26
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
Автор:
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.

Instead...

    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.
2018-04-24 23:30:40
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
Автор:
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.
2018-06-11 22:22:48
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
get_defined_vars() returns all variables - locally defined vars and global vars (well actually only super globals). If you need local vars only  - for example you need to get variables from a file - let's say config.php and you don't want a missing value to be replaced with a global defined somewhere else.

<?php

 
/**
   * Filters out global vars from get_defined_vars() in order to get local vars only
   * @param array $localVars pass get_defined_vars() here
   *
   * @return array local vars only
   */
 
function removeGlobals(array $localVars) {
    return 
array_diff_key($localVars$GLOBALS);
  }

 
define('CONFIG_FILE_PATH''/path/to/config.php');
  function 
readConfig() {
    require 
CONFIG_FILE_PATH;
   
$config removeGlobals(get_defined_vars());
    return 
$config;
  }

?>
2021-02-02 14:35:58
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
NOTE: when you call code by eval() PHP append self vars to result, they have "__" prefix ("__source_code" and "__bootstrap_file" in PHP 7.3).

Fix:
<?php
function filter_eval_vars(array $vars): array
{
    foreach (
$vars as $key => $value) {
         if (
$key[0] === '_' && $key[1] === '_') {
              unset(
$vars[$key]);
         }
    }
    return 
$vars;
}

?>
2021-02-05 11:29:23
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
Insert this at point of interest; add keys of unwanted 1st dim variables to 2nd param of array_diff_key
<?php
echo '<pre>defined_except 'var_dump (array_diff_key (get_defined_vars(), ['GLOBALS'=>0,'_SERVER'=>0])); echo ' '.basename(__FILE__).':'.__LINE__.'</pre>'#die;
?>
2021-06-22 04:27:51
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
Автор:
get_defined_vars() is very useful for importing many values at once 
into another scope (Such as User-defined functions).

Below is an example for showing some of many values and their variable-names in a table.
(useful in debugging)

You can put this user-defined function at many places in your script 
to show some values (values to be changed in loops) 
to check if they are what they shall be there or not.

<?php
// Set "get_defined_vars()" to 2nd argument.
function get_value_table($name_array$gdv) {
   
$name_value_table = [];
    foreach (
$name_array as $name) :
        if (!
array_key_exists($name$gdv)) :
           
$value 'undefined';
        elseif (
is_bool($gdv[$name])) :
           
$value $gdv[$name]? 'true' 'false';
        elseif (
is_numeric($gdv[$name]) || is_string($gdv[$name])) :
           
$value $gdv[$name];
        elseif (
is_array($gdv[$name])) :
           
$value '<pre>'.print_r($gdv[$name],true).'</pre>';
        else :
           
$value = (PHP_VERSION_ID >= 80000)? get_debug_type($gdv[$name]) : get_type($gdv[$name]);
        endif;
       
$name_value_table[] = '<tr><td>$'.$name.'<td>'.$value;
    endforeach;
    return 
'<table border=1>'.implode("\n"$name_value_table).'</table>';
// (f) get_value_table()

$_1 'a';
$_2 'b';
$_3 = [1,2];
$_4 false;
$_5 null;

$name_array = ['_1','_2','_3','_4','_5','_6'];
$show_id 1;

if (
$show_id === 1) :
    echo 
get_value_table($name_arrayget_defined_vars());
endif;
/* 
if $show_id === 1, only shows below.

$_1      a
$_2      b
$_3      Array
      (
          [0] => 1
          [1] => 2
      )
$_4      false
$_5      null
$_6      undefined
*/

$_2 'c';
if (
$show_id === 2) :
    echo 
get_value_table($name_arrayget_defined_vars()); // $_2   c
endif;
# if $show_id === 2, $_2 turns "c".

?>
2021-09-05 05:55:42
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html
Be aware of what get_defined_vars() function returns in different contexts:

- In global scope, a list of all defined variables, whether superglobals, command line arguments or user-defined variables
- In function scope, only a list of user-defined variables (both arguments and in-body definitions)
- In class/object method scope, does not return class/object properties;

Also, as of PHP 5.4, does not return $_ENV even where available.

For further details and scope tests/results, see https://github.com/php/doc-en/issues/1317
2022-01-10 13:27:56
http://php5.kiev.ua/manual/ru/function.get-defined-vars.html

    Поддержать сайт на родительском проекте КГБ