Содержание
Здравствуйте, уважаемые читатели блога LifeExample, если среди вас есть те кому часто приходится разбираться в чужом коде, то материал из данной статьи о списке переменных php может , хорошо сэкономить ваше время. Когда вам поступает задание на доработку php скрипта чей-нибудь самодельной СMS, очень полезным бывает узнать список всех переменных, уже определенных до момента отработки текущего скрипта.
Наверняка многие из вас при знакомстве с чужим кодом и алгоритмами его работы, пользуются стандартным методом отладки, вставляя в тело скрипта записи примерно такого вида:
И тому подобные модели отслеживания процесса преобразований над php переменными.
Все это, несомненно, помогает вникнуть в чужую систему, и разобраться с кодом. Но представьте ситуацию, когда чужая система очень хитро обрабатывает все переменные, таким образом, что нельзя с уверенностью сказать в каком месте появилась переменная и какое имя ей присвоено.
В этот момент хорошо бы как-нибудь узнать весь список переменных PHP, определенных ранее, и вывести его для ознакомления.
Как вывести список определенных переменных
Сделать это можно с помощью функции get_defined_vars(), например таким образом:
Эта функция get_defined_vars(), вернет многомерный массив, содержащий список всех определенных пользовательских и серверных переменных, в той области видимости, в которой была вызвана.
Для того чтобы получить лишь список названий доступных переменных, можно использовать такую конструкцию:
Согласитесь это очень удобно, знать имена и значения только тех переменных, которые доступны именно в месте вывода.
Кроме get_defined_vars(), может пригодиться вывод глобального массива $GLOBALS для получения данных о данных содержащихся в массивах $_POST, $_GET, $_COOKIE, $_FILES, $_SESSION, $_SERVER, $_ENV .
Теперь вы уважаемые читатели знаете, как просто можно осуществить вывод всех переменных, и спокойно изучать cписок переменных php, не тратя кучу времени, на ручную работу, по отслеживанию объявлений
Читайте также похожие статьи:
Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.
Я работаю с Moodle, и есть много глобальных переменных, и похоже, что нет надлежащей документации. Сначала я подумал: «Да, просто посмотри, что echo ""; ». Но когда я пытаюсь это сделать, мой браузер перестает отвечать на запросы при рендеринге, и результат рендеринга становится беспорядочным. К сожалению, у меня нет возможности использовать отладчик, поскольку пакет xdebug недоступен для используемого мной дистрибутива. . (Прибор Moodle под ключ)
Итак, мой вопрос: есть ли способ увидеть только имена всех глобальных переменных, чтобы я мог проверить их по отдельности?
Решение
Самый простой ответ — откройте lib / setup.php, прокрутите вниз примерно до строки 418, и все они там определены.
Пока ты в этом, Moosh также может сгенерировать файл, который позволяет автозаполнение всех переменных $ CFG-> на вашем сайте Moodle (не отвечает непосредственно на вопрос, но тесно связан).
Другие решения
возможно array_keys ($ GLOBALS)&
использование get_defined_vars () чтобы получить все переменные в этой области, которые могут быть во всем сценарии или в конкретной функции.
Как вы указали, $GLOBALS на самом деле способ увидеть все глобальные переменные.
Причина, по которой ваш скрипт умирает, в том, что у вас большое количество переменных, и у каждой из них, вероятно, много дочерних объектов (возможно, даже рекурсивных).
Если вы просто хотите список имена из переменных, просто сделайте var_dump(array_keys($GLOBALS)) ,
(PHP 4 >= 4.0.4, PHP 5, PHP 7)
get_defined_vars — Возвращает массив всех определенных переменных
Описание
Эта функция возвращает многомерный массив, содержащий список всех определенных переменных, будь то переменные окружения, серверные переменные или переменные, определенные пользователем, в той области видимости, в которой была вызвана get_defined_vars() .
Возвращаемые значения
Многомерный массив со всеми переменными.
Примеры
Пример #1 Пример использования get_defined_vars()
= array( 1 , 1 , 2 , 3 , 5 , 8 );
// печатает $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() — Возвращает ассоциативный массив с именами всех констант и их значений
User Contributed Notes 15 notes
dirty code sample:
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()
)
[ _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 » ;
print » ;
?>
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.
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 );
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[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
" ;
// 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 .= "
Mysql Messages:
" . mysql_error ( $link );
>
// End MySQL
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.
" ;
>
else <
echo "Failed to send Debug Report.
" ;
>
>
>
?>
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 >
" );
obj2xml ( $val , $indent . ‘ ‘ );
print( " $indent $key >
" );
>
else print( " $indent $key$attr > $val $key >
" );
>
>
//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’ ;
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" ;
?>
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:
= array();
$var_names = array_keys ( get_defined_vars ());
foreach ( $var_names as $var_name )
<
$defined_vars [ $var_name ] =& $ $var_name ;
>