Область видимості змінних 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,"
"; ?>

Хочу ще раз звернути вашу увагу, що це рішення не є єдиним вірним. Наприклад, наступний код призведе до такого самого результату:

13 years ago

A little gotcha to watch out for:

Якщо ви збираєтеся off RegisterGlobals і відношення, якщо ви використовуєте get_defined_vars(), ви можете дати деякий час як ви бачите:

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 буде appear in both lists. I guess it"s no really a gotcha, because nothing bad will happen either way, but it"s interesting curiosity nonetheless.

6 років тому

Since get_defined_vars() тільки gets variables в пункті вашої функції, вони є прямий спосіб отримати варіативи, визначені в поточному рядку.

// 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 років тому

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 для створення повідомлення про те, щоб відтворити або роздрукувати email.
// Usage: generateDebugReport(method,get_defined_vars(),email);
// Where method is "browser" чи "email".

// Create an ignore list for keys returned by "get_defined_vars".
// Для прикладу, HTTP_POST_VARS, HTTP_GET_VARS та інші
// 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 або 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 років тому

Simple routine to convert 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:


Джон
Smith


Bannana
Carrot

11 років тому

As a note, get_defined_vars() does no 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). Це буде добре, якщо get_defined_vars() мав опційний argument для того, щоб ним повідомити, але я маю на увазі його особливу потребу.

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

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

?>

1 рік тому

Я поставив її до "цього", що знаходиться в get_defined_vars.

Це не з'являється без будь-яких випадків, але в певних випадках це буде неймовірно 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")

Це не є PHP 7.2, а PHP 5.6.

1 рік тому

Кілька коментарів ви можете довідатися, що це функція wont return references. Це означає, що return names and names є "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 $() Ви можете також використовувати $$.

I have done some whacky things in my time to make extremely generic code but I"ve never had to do anything як ні."

Ви можете також у $$key++ but I've never seen code like that which wasn't horrifically bad (using dynamic where dynamic isn't beneficial).

Якщо ви здогадаєтеся про те, що це природно, це додаткової скрути.

У цьому уроці розглядається область видимості змінних PHP. Пояснюється відмінність локальної та глобальної області видимості, показується як отримати доступ до глобальних змінних усередині функції, як працювати з суперглобалами та створювати статичні змінні.

Коли приступаєш до вивчення PHP і починаєш працювати з функціями та об'єктами, область видимості змінних викликає деяке збентеження. На щастя, правила PHP у цьому відношенні дуже прості для розуміння (порівняно з іншими мовами програмування).

Що таке область видимості?

Область видимості змінних - це контекст, у якого змінну було визначено і де до неї можна отримати доступ. У PHP є дві області видимості змінних:

  • Глобальна- до змінних можна отримати доступ у будь-якому місці скрипту
  • Локальна- До змінних можна отримати доступ тільки всередині функції, в якій вони були визначені

Область видимості змінної, а особливо локальна, істотно полегшує управління кодом. Якби всі змінні були глобальними, їх можна було б змінювати в будь-якому місці скрипту. Це призвело б до хаосу та великих скриптів, оскільки дуже часто різні частини скрипту використовують змінні з однаковими іменами. Обмежуючи область видимості локальним контекстом, ви визначаєте межі коду, який може отримати доступ до змінної, що робить код більш стійким, модульним і простим у налагодженні.

Змінні з глобальною областю видимості називаються глобальними, і з локальної областю видимості - локальними.

Ось приклад того, як працюють глобальні та локальні змінні.

"; ) sayHello(); echo "Значення \$globalName: "$globalName"
"; echo "Значення \$localName: "$localName"
"; ?>

Привіт Гаррі! Значення $globalName: "Зоя" Значення $localName: ""

У цьому скрипті ми створили дві змінні:

  • $globalName- це глобальназмінна
  • $localName- це локальназмінна, яка створена всередині функції sayHello().

Після створення змінної та функції скрипт викликає sayHello(), який виводить "Привіт, Гаррі!" . Потім скрипт намагається вивести значення двох змінних за допомогою функції echo. Ось що відбувається:

  • Так як $globalNameбула створена поза функцією, вона доступна в будь-якому місці скрипта, тому виводиться "Зоя".
  • $localNameбуде доступною лише всередині функції sayHello() . Так як вираз echo знаходиться поза функцією, PHP не дає доступу до локальної змінної. Натомість PHP передбачає, що код буде створювати нову змінну з ім'ям $localName , яка отримає значення за умовчанням - порожній рядок. ось чому другий виклик echo виводить значення "" для змінної $ localName .

Доступ до глобальних змінних усередині функції

Для отримання доступу до глобальної змінної поза функцієюдосить просто написати її ім'я. Але для отримання доступу до глобальної змінної всередині функції, потрібно спочатку оголосити змінну як глобальну функції за допомогою ключового слова global:

Function myFunction() ( global $globalVariable; // Доступ до глобальної змінної $globalVariable )

Якщо не зробити цього, то PHP передбачає, що ви створюєте або використовуєте локальну змінну.

Ось приклад скрипта, який використовує глобальну змінну всередині функції:

"; global $globalName; echo "Привіт, $globalName!
"; ) sayHello(); ?>

При виконанні скрипт виведе:

Привіт Гаррі! Привіт Зоя!

Функція sayHello() використовує ключове слово global для оголошення змінної $globalName як глобальної. Після чого вона може отримати доступ до змінної та вивести її значення ("Зоя").

Що таке суперглобали?

PHP має спеціальний набір зумовлених глобальних масивів, що містять різноманітну інформацію. Такі масиви називаються суперглобалів,тому що вони доступні з будь-якого місця скрипта, включаючи внутрішній простір функцій, і їх не потрібно визначати за допомогою ключового слова global .

Ось список суперглобалів, доступних у PHP версії 5.3:

  • $GLOBALS - список всіх глобальних змінних у скрипті (за винятком суперглобалів)
  • $_GET - містить перелік всіх полів форми, надісланої браузером за допомогою запиту GET
  • $_POST - містить список усіх полів форми надісланої браузером за допомогою запиту POST
  • $_COOKIE - містить список всіх куки, надісланих браузером
  • $_REQUEST - містить усі поєднання ключ/значення, які містяться в масивах $_GET, $_POST, $_COOKIE
  • $_FILES - містить список всіх файлів, завантажених браузером
  • $_SESSION - дозволяє зберігати та використовувати змінні сесії для поточного браузера
  • $_SERVER - містить інформацію про сервер, таку як ім'я файлу виконуваного скрипта та IP адресу браузера.
  • $_ENV - містить перелік змінних середовища, що передаються PHP, наприклад, CGI змінні.
Наприклад, можна використовувати $_GET для того, щоб отримати значення змінних ув'язнених у рядку URL запиту скрипту, і вивести їх на сторінці:

Якщо ви запустите наведений вище скрипт за допомогою рядка URL http://www.example.com/script.php?yourName=Фред, то він виведе:

Привіт, Фреде!

Попередження!У реальному скрипті ніколи не можна використовувати подібну передачу даних через слабку безпеку. Потрібно завжди здійснювати перевірку чи фільтрацію даних.

Суперглобал $GLOBALS дуже зручно використовувати, тому що він дає можливість організувати доступ до глобальних змінних до функцій без необхідності використання ключового слова global . Наприклад:

"; ) sayHello(); // Виводить "Привіт, Зоя!" ?>

Статичні змінні: вони знаходяться десь поруч

Коли ви створюєте локальну змінну всередині функції, вона існує тільки доки працює функція. Після завершення функції локальна змінна зникає. Коли функція знову з'являється, створюється нова локальна змінна.

Найчастіше це добре працює. Таким чином, функції самодостатні і працюють завжди однаково при кожному виклику.

Однак є ситуації, коли було б зручно створити локальну змінну, яка "пам'ятає" своє значення між викликами функції. Така змінна називається статичною.

Для створення статичної змінної функції необхідно використовувати ключове слово static перед ім'ям змінної і обов'язково задати їй початкове значення. Наприклад:

Function myFunction() ( static $myVariable = 0; )

Розглянемо ситуацію, коли зручно використати статичну змінну. Допустимо, ви створюєте функцію, яка при викликі створює віджет і виводить кількість вже створених віджетів. Можна спробувати написати такий код із використанням локальної змінної:


"; echo createWidget() . " ми вже створили.
"; echo createWidget() . " ми вже створили.>
"; ?>

Але, оскільки змінна $numWidgets створюється щоразу під час виклику функції, ми отримаємо наступний результат:

Створюємо деякі віджети ... 1 ми вже створили. 1 ми вже створили. 1 ми вже створили.

Але з використанням статичної змінної ми зможемо зберігати значення від одного виклику функції до іншого:

"; echo createWidget() . " ми вже створили.
"; echo createWidget() . " ми вже створили.
"; echo createWidget() . " >ми вже створили.
"; ?>

Тепер скрипт видасть очікуваний результат:

Створюємо деякі віджети ... 1 ми вже створили. 2 ми вже створили. 3 ми вже створили.

Хоча статична змінна зберігає значення між викликами функції, вона діє лише у момент виконання скрипта. Як тільки скрипт завершує своє виконання, всі статичні змінні знищуються, як і локальні і глобальні змінні.

От і все! Найчастіше звертайтеся до документації з PHP.

Змінні у php- це якийсь інформаційний контейнер, який може містити різні типи даних (текст, цифри, масиви і так далі). У цілому нині змінні дозволяють створювати, зберігати, змінювати, а надалі оперативно звертатися до інформації, заданої у яких.

Як створити змінну в PHP

Спочатку змінні містять знак $ (долар) - позначення використання змінної, потім літери латинського алфавіту(від a до z та маленькі та великі), наприкінці можу утримувати цифри. Також у назві допускається використання нижнього підкреслення (не в кінці).

Як можна називати змінні:

$var
$variable
$year1945
$_variable
Як не можна називати змінні:

$1 - складається лише із цифри
$1var - не можна починати назву змінної з цифри
$/var - із додаткових символів допускається лише нижнє підкреслення _
$змінна - кирилиця дозволена документацією php, але не рекомендована
$var iable - не можна використовувати прогалини

Кожній змінній надається значення. Для надання значення використовується знак = (Рівно). Протягом обробки скрипта значення змінної може неодноразово змінюватись в залежності від різних умов.

$ city = "Москва"; // змінної $city надали рядкове (у лапках) значення Москва
$year = 1147; // а змінної $year надали числове значення 1147
?>

$name = "Олександр";
$Name = "Олексій";
echo "$name, $Name"; // виведе "Олександр, Олексій"
?>

Висновок змінних PHP

Окремо слід розібрати те, як відобразити змінні за допомогою операторів виведення, роботу яких ми розібрали у минулому уроці Створення сторінки PHP. Оператори виведення. . Нижче наведу низку наочних прикладів із коментарями.

// Так задаємо значення змінним
$name1 = "Олексій";
$name2 = "Олександр";

// Виводимо змінні
echo $name2; // Виведе: Олександр
echo "name1 - це $name1"; // name1 – це Олексій

// При використанні одиночних лапок виводиться
// Ім'я змінної, а чи не значення
echo "name1 - це $ name1"; // виведе: name1 - це $ name1

// можна вивести просто значення змінних
echo $name1; // Олексій
echo $name1, $name2; // Олексій Олександр
echo $name1." ".$name2; // Олексій Олександр
echo "$name1, $name2"; // Олексій, Олександр

Echo<<Тут використовується синтаксис "here document" для виведення
кількох рядків із підстановкою змінних $variable.
END;

Операції зі змінними PHP

Арифметичні операції у PHP
Що стосується числовими значеннями можна проводити арифметичні операції: додавання, віднімання, множення тощо.

-$a(заперечення) Зміна символу $a.
$a + $b(додавання) Сума $a та $b.
$a - $b(віднімання) Різниця $a і $b.
$a * $b(множення) Добуток $a та $b.
$a / $b(поділ) Приватне від поділу $a на $b.
$a % $b(розподіл за модулем) Цілочисельний залишок від розподілу $a на $b.
Розглянемо приклади

$a = 2; // Зауважте, у випадку з цифрами лапки не ставляться
$ b = 3; // Зауважте, у випадку з цифрами лапки не ставляться

$result = $a + $b; // Складаємо змінні
echo $result; // виведе 5

$result = $b - $a; // Складаємо змінні
echo $result; // виведе 1

Операції інкременту та декременту в PHP
Дані операції стануть в нагоді в основному при побудові циклів, про які поговоримо трохи пізніше.
Префіксний- оператори, прописані ПЕРЕД змінною ( --$a; ++$a). Повертають значення змінної до змін.
Постфіксний- Оператори, що прописуються після змінної ( $a--; $a--). Повертають значення змінної із змінами.
Інкремент- Збільшення значення.
Декремент- Зменшення значення.

++$aПрефіксний інкремент. Збільшує $a на одиницю та повертає значення $a.
$a++Постфіксний інкремент. Повертає значення $a, а потім збільшує $a на одиницю.
--$aПрефіксний декремент. Зменшує $a на одиницю та повертає значення $a.
$a--Постфіксний декремент. Повертає значення $a, а потім зменшує $a на одиницю.
echo "

Постфіксний інкремент

";
$a = 5;
echo "Має бути 5: " . $a++ . "\n";

Echo "

Префіксний інкремент

";
$a = 5;
echo "Має бути 6: " . ++$a . "\n";
echo "Має бути 6: " . $a . "\n";

Echo "

Постфіксний декремент

";
$a = 5;
echo "Має бути 5: " . $a-- . "\n";

Echo "

Префіксний декремент

";
$a = 5;
echo "Має бути 4: " . --$a . "\n";
echo "Має бути 4: " . $a . "\n";
?>

Операції присвоєння в PHP
Базовий операторвиглядає як = . На перший погляд може здатися, що це оператор одно. Насправді, це не так. Насправді, оператор присвоєння означає, що лівий операнд набуває значення правого вираження (тобто встановлюється результуючим значенням). Комбіновані оператори- це такі оператори, які дозволяють використовувати попередні значення змінних для наступних операцій (дописувати до рядкової змінної (з текстом) або складати числові значення).

$a = ($b = 2) + 4; //результат: $a встановлена ​​значенням 6, змінної $b присвоєно 2.

$a = 2;
$a += 3; // встановлює $a значенням 5, аналогічно до запису: $a = $a + 3;
$b = "Привіт";
$b .= "Світ!"; // встановлює $b рядком "Привіт Мир!", як і $b = $b . "There!";

Існують також операції порівнянняі логічніале про них ми поговоримо в наступних уроках. Постараюся одразу не лякати Вас великим обсягом інформації!)

Сподобалася стаття? Поділіться з друзями!