Переменные в 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 было возможно косвенное присваивание (например, через переменные переменных).
Смотрите также «Руководство по именованию».
Информацию о функциях работы с переменными даёт раздел функции работы с переменными.
<?php
$var = 'Боб';
$Var = 'Джо';
echo "$var, $Var"; // Выведет "Боб, Джо"
$4site = 'ещё нет'; // Неверно; начинается с цифры
$_4site = 'ещё нет'; // Верно; начинается с символа подчёркивания
$täyte = 'mansikka'; // Верно; 'ä' это (Расширенный) ASCII 228.
?>
По умолчанию переменные присваиваются по значению. То есть, когда переменной присваивают выражение, значение оригинального выражения копируется в эту переменную. Это означает, например, что после присваивания одной переменной значения другой, изменение одной из переменных не влияет на другую. Дополнительную информацию об этом способе присваивания смотрите в разделе «Выражения».
PHP также предлагает другой способ присваивания значений переменным: присваивание по ссылке. Это означает, что новая переменная просто ссылается (иначе говоря, «становится псевдонимом» или «указывает») на оригинальную переменную. Изменения в новой переменной отражаются на оригинале, и наоборот.
Для присваивания по ссылке просто добавьте амперсанд & к
началу имени присваиваемой (исходной) переменной. Например,
следующий фрагмент кода дважды выводит «Меня зовут Боб
»:
<?php
$foo = 'Боб'; // Присваивает переменной $foo значение «Боб»
$bar = &$foo; // Ссылка на переменную $foo через переменную $bar.
$bar = "Меня зовут $bar"; // Изменение переменной $bar...
echo $bar;
echo $foo; // ...меняет и переменную $foo.
?>
Важно отметить, что по ссылке присваиваются только именованные переменные.
<?php
$foo = 25;
$bar = &$foo; // Это верное присваивание
$bar = &(24 * 7); // Неверно; ссылка на неименованное выражение
function test()
{
return 25;
}
$bar = &test(); // Неверно
?>
Хорошей практикой считается инициализировать переменные, хотя в PHP
это не обязательное требование. Неинициализированные переменные
принимают значение по умолчанию своего типа, который зависит
от контекста, в котором встречается переменная: логические переменные
принимают значение false
, целые числа и числа с плавающей точкой —
ноль, строки (например, при вызове с конструкцией echo) —
пустую строку, а массивы становятся пустыми массивами.
Пример #1 Значения по умолчанию в неинициализированных переменных
<?php
// Неустановленная И без ссылок (то есть без контекста использования) переменная; выведет NULL
var_dump($unset_var);
// Логический контекст; выведет 'false' (Подробнее
// об этом синтаксисе рассказывает раздел о тернарном операторе)
echo $unset_bool ? "true\n" : "false\n";
// Строковый контекст; выведет 'string(3) "abc"'
$unset_str .= 'abc';
var_dump($unset_str);
// Целочисленный контекст; выведет 'int(25)'
$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int);
// Контекст числа с плавающей точкой (float); выведет 'float(1.25)'
$unset_float += 1.25;
var_dump($unset_float);
// Контекст массива; выведет array(1) { [3]=> string(3) "def" }
$unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($unset_arr);
// Контекст объекта; создаёт новый объект stdClass (смотрите http://www.php.net/manual/ru/reserved.classes.php)
// Выведет: 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().