Компьютер. Радиоэлектроника. Блоки питания. Справочники. Источники питания. Радиосвязь

Вывести все переменные php. Область видимости переменных PHP. Все, что вы хотели знать, но боялись спросить. Вывод переменных PHP

Наверняка у вас дома есть шкаф или комод. Принцип их использования простой: мы убираем туда вещи, которые не нужны нам прямо сейчас, но могут понадобиться через некоторое время.

Переменные устроены точно также. В них можно положить какое-нибудь значение и хранить там, пока оно не понадобится.

Создание переменных

Положить значение в переменную можно следующим образом:

В коде выше мы создали переменную $name и положили в неё значение Иван , затем создали переменную $age и присвоили ей значение 20 .

Название "переменная" означает, что её значение может меняться во время выполнения скрипта:

В некоторых языках переменную нужно сначала "объявить", а затем уже использовать. В PHP объявления нет - переменная создаётся в тот момент, когда вы кладёте в неё значение.
Тем не менее, PHP-программисты часто говорят "объявить переменную" вместо "создать переменную".

Также вместо "положить в переменную значение" часто говорят "присвоить значение".
Причина проста - символ = , благодаря которому мы сохраняем значение в переменную, называется "оператор присваивания". Отсюда и термин "присвоить".

Правила именования переменных

1. Название переменной начинается с символа $.

2. Вторым символом может быть буква или символ подчёркивания _

Названия переменных регистрозависимы. $name и $Name - это разные переменные.

Вывод значения переменной на экран

Вывести переменную можно с помощью уже известной нам команды echo :

Команда echo позволяет вывести на экран сразу несколько значений:

Заметьте, мы передали в echo 2 значения, разделив их запятой. Так мы можем передавать сколько угодно значений. Следующие два примера приведут к одинаковому результату:

Также в PHP существует сокращённый синтаксис вывода переменных. Вместо

До версии PHP 5.4 сокращённый синтаксис работал только при включении в настройках PHP директивы short_open_tag , которая также позволяет использовать сокращённый открывающий тег

Проверка значения переменной

Команда echo не всегда удобна для проверки текущего значения переменной. К примеру, при попытке вывода пустой строки "" на экран не выведется абсолютно ничего. И непонятно, в чём причина - в пустой переменной или неработающем коде.

Поэтому для проверки значения переменной используется функция var_dump() :

Результат выполнения скрипта:

String(5) "Vasya" string(0) ""

Как видите, PHP вывел не только содержимое переменной, но ещё и количество символов, и даже тип переменной (string - строка). Типы данных мы подробно рассмотрим на следующих уроках.

Удаление переменных

Удалить существующую переменную можно с помощью функции unset() :

А теперь пришло время немного попрактиковаться.

Запомните, практически любая задача на PHP может иметь несколько решений. Поэтому если ваши решения будут отличаться от написанных на этом сайте - это совсем не значит, что вы что-то сделали неправильно.

Напишите скрипт, который:
1. Создаёт переменные с названиями title и content и какими-нибудь значениями.
2. Выводит значение переменной title внутри тега h1, а значение переменной content внутри тега div.

Показать решение

", $title, ""; echo "

", $content, "
"; ?>

Хочу ещё раз обратить ваше внимание, что это решение не является единственно верным. К примеру, следующий код приведёт к такому же результату:

Переменные окружения (среды) в Windows содержат различную информацию о настройках системы и среды пользователя. Различают переменные окружения пользователя, системы и процессов.

Самый простой способ просмотреть содержимое переменных окружения в Windows – открыть свойства системы (sysdm.cpl) -> Дополнительно -> Переменные среды. Как вы видите, в открывшемся есть две секции: в верхней содержатся переменные окружения пользователя, в нижнем – системные.

Кроме того, переменные среды хранятся в реестре системы. Пользовательские переменные хранятся в разделе . Системные – в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment .

Вывести значения всех переменных окружения можно в командной строке Windows. Команда простая:

Команда выведет список переменных среды и их значения.

В PowerShell для вывод всех переменных окружения можно использовать команду:

Если нужно вывести значение только одной переменной, нужно воспользоваться командой echo, причем имя переменной нужно заключить в знаки процентов. Например,

Echo %systemroot%

set > c:\tmp\env_var.txt

Переменные окружения конкретного процесса можно получить с помощью бесплатной утилиты Process Explorer (от Sysinternals). Достаточно открыть свойства процесса и перейти на вкладку 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


Bannana
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.

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


Bannana
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.

Понравилась статья? Поделитесь с друзьями!
Была ли эта статья полезной?
Да
Нет
Спасибо, за Ваш отзыв!
Что-то пошло не так и Ваш голос не был учтен.
Спасибо. Ваше сообщение отправлено
Нашли в тексте ошибку?
Выделите её, нажмите Ctrl + Enter и мы всё исправим!