Basics

Оновлено: 11.05.2023

Змінні в PHP позначаються знаком долара, за яким слідує ім'я змінної. Ім'я змінної є чутливим до регістру.

Назви змінних відповідають тим самим правилам, що й інші мітки в PHP. Правильне ім'я змінної починається з літери або символу підкреслення, за яким слідує будь-яка кількість літер, цифр або символів підкреслення. У вигляді регулярного виразу це буде виглядати так: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

Примітка: Для наших цілей тут літери - це букви від a-z, A-Z та байти від 128 до 255 (0x80-0xff).

Примітка: $this - це спеціальна змінна, яку не можна присвоювати. До версії PHP 7.1.0 було можливе непряме присвоювання (наприклад, за допомогою змінних-змінних).

Дивіться також Посібник з іменування Userland.

<?php
$var = 'Bob';
$Var = 'Joe';
echo "$var, $Var";      // outputs "Bob, Joe"

$4site = 'not yet';     // invalid; starts with a number
$_4site = 'not yet';    // valid; starts with an underscore
$täyte = 'mansikka';    // valid; 'ä' is (Extended) ASCII 228.
?>

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

PHP також пропонує інший спосіб присвоювання значень змінним: присвоювання за посиланням. Це означає, що нова змінна просто посилається (іншими словами, "стає псевдонімом" або "вказує на") на вихідну змінну. Зміни в новій змінній впливають на вихідну, і навпаки.

Для присвоювання за посиланням просто додайте амперсанд (&) на початку змінної, що присвоюється (змінної-джерела). Наприклад, у наведеному нижче фрагменті коду двічі виводиться "Мене звуть Боб":

<?php
$foo = 'Bob';              // Assign the value 'Bob' to $foo
$bar = &$foo;              // Reference $foo via $bar.
$bar = "My name is $bar";  // Alter $bar...
echo $bar;
echo $foo;                 // $foo is altered too.
?>

Важливо зазначити, що тільки іменовані змінні можуть бути присвоєні за посиланням.

<?php
$foo = 25;
$bar = &$foo;      // This is a valid assignment.
$bar = &(24 * 7);  // Invalid; references an unnamed expression.

function test()
{
   return 25;
}

$bar = &test();    // Invalid.
?>

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

Приклад #1 Значення за замовчуванням неініціалізованих змінних

<?php
// Unset AND unreferenced (no use context) variable; outputs NULL
var_dump($unset_var);

// Boolean usage; outputs 'false' (See ternary operators for more on this syntax)
echo $unset_bool ? "true\n" : "false\n";

// String usage; outputs 'string(3) "abc"'
$unset_str .= 'abc';
var_dump($unset_str);

// Integer usage; outputs 'int(25)'
$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int);

// Float usage; outputs 'float(1.25)'
$unset_float += 1.25;
var_dump($unset_float);

// Array usage; outputs array(1) {  [3]=>  string(3) "def" }
$unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($unset_arr);

// Object usage; creates new stdClass object (see http://www.php.net/manual/en/reserved.classes.php)
// Outputs: object(stdClass)#1 (1) {  ["foo"]=>  string(3) "bar" }
$unset_obj->foo = 'bar';
var_dump($unset_obj);
?>

Покладатися на значення за замовчуванням неініціалізованої змінної проблематично у випадку включення одного файлу в інший, який використовує те саме ім'я змінної. Помилка рівня E_WARNING (до версії PHP 8.0.0 - E_NOTICE) видається у випадку роботи з неініціалізованими змінними, але не у випадку додавання елементів до неініціалізованого масиву. Мовна конструкція isset() може бути використана для виявлення того, що змінна вже була ініціалізована.