Получить все переменные php

Здравствуйте, уважаемые читатели блога 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 под ключ)

Читайте также  Сканер mustek bearpaw 2400cu plus

Итак, мой вопрос: есть ли способ увидеть только имена всех глобальных переменных, чтобы я мог проверить их по отдельности?

Решение

Самый простой ответ — откройте 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()
)

[ _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 » ;
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 ;
>

Ссылка на основную публикацию
Adblock
detector