Переменные в php. PHP: Переменные. Проверка существования переменной. Оператор isset

12 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

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

Если вы еще никогда не писали программ, не встречались с булевой алгеброй или еще чем, то концепция переменных может быть для вас новой. Но не волнуйтесь, сейчас мы быстро введем вас в курс дела, это не так сложно!

Переменная является средством хранения значения, такого как текстовая строка «Hello World!» или целое значение 4. Переменная может быть использована в любом месте кода, вместо того, чтобы вводить фактические значения снова и снова. В PHP вы определяете переменную следующим образом:

  • $variable_name = Value;

Как вы видите, любая переменная начинается со знака доллара. Нельзя о ней забывать, иначе ничего работать не будет. Это распространенная ошибка начинающих программистов PHP!

Примечание: Кроме того, имена переменных чувствительны к регистру, так что используйте тоже самое написание при использовании переменной, что и при объявлении. Переменные $a_number и $A_number различные переменные в глазах PHP.

Небольшой пример с переменными

Итак, чтобы использовать переменные в языке php, мы должны сначала ее объявить (для этого придумать имя) и задать ей значение. Вот как это правильно сделать:

Примечание: PHP не требует объявления переменных перед использованием. Например, в Pascal нам бы потребовалось сначала объявить весь список переменных в разделе var. В пхп ничего такого не нужно.

Разрешенные названия переменных

Есть несколько правил, которые нужно соблюдать при выборе имени для ваших PHP переменных.

  • PHP переменных должны начинаться с буквы или символа подчеркивания «_».
  • PHP переменные могут состоять только из буквенно-цифровых знаков и символов подчеркивания. a-z, A-Z, 0-9, или _.
  • Переменные из более чем одного слова могут быть разделены подчеркиванием. $my_variable
  • Переменные из более чем одного слова также можно разделить регистром. $myVariable

На этом все. Теперь у вас в руках есть такой мощный инструмент, как переменные! Вперед, к новым урокам!

12 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

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

Последнее обновление: 1.11.2015

Как и во многих языках программирования, в PHP есть переменные. Переменные хранят отдельные значения, которые можно использовать в выражениях на PHP. Для обозначения переменных используется знак доллара $ . Например,

Здесь определена переменная, которая будет хранить число 10. Присвоение значения происходит с помощью знака равенства = .

Можно присваивать значение другой переменной:

$a = 10; $b=$a; echo $b;

PHP является регистрозависимым языком, а значит, переменные $counter и $Counter будут представлять две разные переменные.

Также при наименовании переменных нам надо учитывать следующие правила:

    Имена переменных должны начинаться с алфавитного символа или с подчеркивания

    Имена переменных могут содержать только символы: a–z, A–Z, 0–9, и знак подчеркивания

    Имена переменных не должны включать в себя пробелы

Проверка существования переменной. Оператор isset

Если переменная объявлена, но ей изначально не присвоено никакого значения (иначе говоря она не инициализирована), то нам будет проблематично ее использовать. Например:

При попытке вывести значение переменной мы получим диагностическое сообщение о том, что переменная не определена: Notice: Undefined variable: a in C:\localhost\echo.php on line 3 .

Оператор isset() позволяет определить, инициализирована ли переменная или нет. Если переменная определена, то isset() возвращает значение true . Если переменная не определена, то isset() возвращает false . Например:

Для проверки переменной использовалась конструкция if...else , которая определяет истинность выражения. И если выражение истинно, тогда выполняется выражение после блока if. Если же выражение ложно (то есть равно false), выполняется выражение после блока else

Здесь переменная не инициализирована, поэтому оператор isset($a) будет возвращать значение false , и, следовательно, будет срабатывать блок else . Если бы мы присвоили переменной некоторое начальное значение, например, $a=20 , то оператор isset возвратил бы значение true , и браузер вывел бы ее значение.

С помощью оператора unset() мы можем уничтожить переменную:

Как и во всех языках программирования, в PHP есть переменные. В этой статье мы рассмотрим какие бывают переменные, приведем примеры использования переменных в PHP.

Все переменные в PHP начинаются со знака доллар "$". Далее после этого знака может находиться любая последовательность состоящая из буквенно-цифровых символов (включая знак подчеркивания), но первый символ не может быть цифрой.

Примеры корректных переменных в PHP: $per, $p1e2r3e, $user_10, $_user_10, $prosto_dlinnaya_peremennaya и т.д.

Стоит отметить, что PHP чувствителен к регистру, а значит переменные $pEr, $per, $PER - будут разные. Например:

//можно было написать и так: echo $pEr.", ".$per.", ".$PER; //точка "." является в роли "плюса" ?>

На экране будет выведено: 1, 2, 3.

В PHP не надо указывать явно тип данных у переменных. Одна и та же переменная может иметь разные типы данных в одной программе. Приведу пример.

// переменная $text имеет числовой тип echo $text; // вывод на экран 12345 $text = "Текст"; // переменная $text имеет строковый тип echo $text; // вывод на экран "Текст" $text = 5+5; // переменная $text имеет опять числовой тип echo $text; // вывод на экран 10 ?>

Чтобы вывести текст $text (название самой переменной) нужно поставить перед ней обратный слэш "\":

// вывод на экран $text = Текст ?>

Существует специальная функция unset(имя_переменной) , которая позволяет уничтожать объявленные переменные. В основном это делается для освобождения памяти. Например:

// объявление переменной $text

"; // В данном случае будет выведено, что $text существует echo "Запускаем процедуру unset
"; unset($text); // Удаляем переменную $text if(isset($text)) echo "Переменная $text существует
"; else echo "Переменная $text не существует
"; // Будет выведено, что переменная $text не существует ?>

С помощью функции isset(имя_переменной) можно проверять существование переменных. Функция возвращает true (истина) в случае существования и false (ложь) в противном случае. Очень похожей функцией является empty(имя_переменной) , которая возвращает true в случае если переменная не существует, равна нулю или пустой строке и false в противном случае.

Константы в PHP

Константы в PHP в отличии от переменных очень похожи на константы в других языках, поскольку они не могут менять своё значение. Для объявление константы в PHP есть специальная функция define("ИМЯ_КОНСТАНТЫ", значение_константы) . Приведем пример:

//некорректное объявление константы //поскольку первый символ должен быть не цифрой ?>

Требования к именованию констант аналогичны требованиям именованию переменных. По этой причине в рассмотренном примере выше, последнее объявление константы "1CON" является некорректным.

В PHP принято именовать константы с больших букв (это является рекомендацией, а не требованием). Советую также придерживаться этой рекомендации, чтобы Вас лучше понимали другие php-программисты, да и Вам самим будет легче разбираться в своем коде соблюдая какие-то определенные правила.

Для проверки существования константы существует специальная функция defined(ИМЯ_КОНСТАНТЫ) , которая выдает true (истина) в случае существования константы и false (ложь) в другом случае. Приведем пример использования функции defined:

В PHP есть так же предопределенные константы, которые Вы можете видеть в таблице:

Пример применения выше описанных предопределенных констант приведен ниже:

Строка: ".__LINE__; ?>

Внешние переменные в PHP

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

Протокол HTTP позволяет передавать и считывать данные с помощью методов GET и POST . Выбор метода можно задать в html-формах (см. тег form).

Эти методы (GET и POST) являются очень важными, поэтому для описание этих методов был посвящен целый урок 3: