Работа с переменными в PHP
Узнайте, как создавать, проверять, копировать и удалять переменные в PHP: isset, gettype, settype, ссылки и динамические переменные.
Введение
Работа с переменными — это совокупность приёмов для создания, проверки, копирования и удаления значений, с которыми работает PHP-скрипт. Эта страница выходит за рамки простого присвоения значения: она охватывает проверку существования переменной (isset), определение и изменение её типа (gettype / settype), создание ссылок и более динамические возможности PHP — переменные переменные и переменные функции.
Если вы ещё никогда не объявляли переменные в PHP, начните с разделов Переменные PHP и Типы данных PHP, а затем вернитесь сюда для изучения приёмов работы с переменными.
Объявление и присвоение переменных
В PHP имя переменной начинается со знака доллара ($), за которым следует буква или символ подчёркивания. Тип указывать не нужно — PHP выводит его из значения, которое вы присваиваете с помощью оператора =.
<?php
$name = "John"; // string
$age = 30; // integer
$price = 19.99; // float
$active = true; // booleanPHP является динамически типизированным языком: одна и та же переменная может содержать строку сейчас и число позже. Переменная просто принимает тип того значения, которое было присвоено ей последним.
Интерполяция строк
Внутри строк в двойных кавычках (и heredoc) PHP заменяет переменную её значением. Строки в одинарных кавычках воспринимаются буквально и не поддерживают интерполяцию.
Проверка и удаление переменных
Перед чтением переменной, которая может не существовать, проверьте её наличие. Три следующие функции являются основой безопасной работы с переменными:
| Функция | Возвращает true, если... |
|---|---|
isset($var) | переменная существует и не равна null |
empty($var) | переменная не установлена, равна null, 0, "", "0", false или [] |
unset($var) | (нет возвращаемого значения) уничтожает переменную, после чего isset возвращает false |
<?php
$user = null;
var_dump(isset($user)); // bool(false) — null counts as "not set"
$count = 0;
var_dump(empty($count)); // bool(true) — 0 is "empty"
$temp = 10;
unset($temp);
var_dump(isset($temp)); // bool(false) — destroyedisset — это защитная функция, к которой обращаются чаще всего, особенно при работе с суперглобальными переменными типа $_GET и $_POST, где ключ может отсутствовать.
Проверка и изменение типов
Поскольку PHP выводит типы автоматически, иногда нужно узнать, какой тип имеет значение в данный момент, или принудительно выполнить преобразование.
<?php
$price = 19.99;
echo gettype($price); // double (PHP's name for float)
$input = "42";
settype($input, "integer");
echo $input + 8; // 50 — now a real integer, not the string "42"Используйте gettype для получения удобочитаемого имени типа и settype (или приведение, например (int)) для преобразования на месте. Для сравнений предпочтительнее использовать функции с учётом типов: is_int(), is_string(), is_array() и подобные.
Продвинутые возможности работы с переменными
Когда основы усвоены, PHP предлагает ещё три динамических приёма. Используйте их осторожно — они мощные, но могут снизить читаемость кода.
Ссылки на переменные
Ссылка позволяет двум именам указывать на одно и то же значение. Присвоение выполняется с помощью =&, и любое изменение через одно имя будет видно через другое.
<?php
$count = 1;
$alias =& $count; // $alias is now another name for $count
$alias = 5;
echo $count; // 5 — changed through the referenceСсылки особенно важны при передаче аргументов в функции по ссылке (function f(&$x)), что позволяет функции изменять переменную вызывающего кода.
Переменные переменные
Переменная переменная использует значение одной переменной как имя другой. Синтаксис $$ читает внутреннюю переменную для построения внешнего имени.
<?php
$var = "greeting";
$$var = "Hello"; // creates $greeting
echo $greeting; // HelloЭто иногда удобно для динамических имён полей, но ассоциативный массив почти всегда будет понятнее и безопаснее.
Переменные функции
Если строковая переменная содержит имя функции, добавление () вызывает эту функцию динамически.
<?php
$fn = "strlen";
echo $fn("Hello World"); // 11Это используется для простых таблиц диспетчеризации и обратных вызовов. Современный PHP обычно предпочитает вызываемые объекты первого класса или замыкания, но переменные функции по-прежнему допустимы и работают быстро.
Лучшие практики
- Используйте осмысленные имена.
$counterили$totalPriceгораздо лучше передают намерение, чем$xили$tmp. - Инициализируйте переменные перед использованием. Чтение неопределённой переменной вызывает предупреждение; задайте значение по умолчанию или используйте защиту с
isset(). - Избегайте глобальных переменных. Передавайте значения как аргументы функций или оборачивайте состояние в объекты вместо использования
global. Смотрите Область видимости переменных, чтобы понять, почему изоляция области видимости важна. - Предпочитайте массивы переменным переменным. Их легче перебирать, отлаживать и анализировать.
- Используйте объявления типов. Типизированные параметры (
function setAge(int $age)) помогают обнаруживать ошибки на раннем этапе и делают код самодокументируемым.
Итоги
Работа с переменными в PHP — это не только присвоение значений: она включает проверку существования с помощью isset/empty, удаление значений с помощью unset, проверку и преобразование типов с помощью gettype/settype, а также динамические инструменты — ссылки, переменные переменные и переменные функции. Опирайтесь на простые и явные приёмы в повседневной работе, а динамические инструменты оставьте для тех редких случаев, когда они действительно необходимы.