PHP: полный мануал с примерами, функциями и ООП
Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Дерево руководства
Глава 146 · С нуля → справочник
Работа с переменными: тип, наличие, преобразование и диагностика
Полная категория book.var: от is_string и isset до ресурсов, сериализации и исследования значений. Проверки не подменяют валидацию; каждый инструмент объяснён на небольшом и прикладном примере.
Сначала вопрос о данных, затем подходящая функция
Проверка отвечает на вопрос, исходное значение остаётся
Первая программа сохраняет строку "0". Две проверки возвращают ответы разных проверяемых условий.
- 1$quantity = "0"↓
В переменной строка из одного символа. Кавычки важны.
- 2is_int($quantity) → false↓
Тип не int. Функция ничего не преобразовала.
- 3is_string($quantity) → true↓
Тип string. Это не проверка допустимого количества.
- 4echo $quantity → 0
Выводится исходный текст, оставшийся в переменной.
Проверка типа, проверка правил магазина и преобразование — отдельные операции. Совпадающий вид вывода не означает одинаковый PHP-тип.
Интеграция прислала количество товара. Прежде чем считать итог, нужно понять: значение вообще есть, какого оно типа, соответствует ли правилам магазина и требуется ли преобразование. Это четыре разных вопроса. Число 0 может означать пустой склад; строка "0" — текст из формы; null — пока неизвестный остаток.
<?php
$quantity = "0";
var_dump(is_int($quantity));
var_dump(is_string($quantity));
echo $quantity;
Ожидаемый результат
bool(false)
bool(true)
0Знак = сохраняет значение; кавычки создают строку; скобки передают её функции. is_int/is_string возвращают логический ответ true или false. var_dump показывает этот ответ вместе с типом bool. echo выводит исходный текст; функции проверки его не преобразовали.
В сигнатурах mixed означает, что функция принимает значения разных типов. Знак & у параметра предупреждает об изменении переданной переменной. Запись : bool обозначает тип возвращаемого ответа. Полное устройство вызова — в главе функций.
Наличие, тип, допустимость и преобразование
| Вопрос | Инструмент | Чего он не доказывает |
|---|---|---|
| Есть значение, отличное от null? | isset | Поле может содержать пустую строку или ноль. |
| Есть ключ, даже с null? | array_key_exists | Тип и смысл содержимого проверяют отдельно. |
| Это строка / массив / число? | is_string / is_array / is_numeric | Правильный тип не означает правильный email, положительную цену или разрешённый ID. |
| Что реально пришло? | get_debug_type / var_dump | Диагностический вывод нельзя бездумно отправлять посетителю. |
| Как получить другой тип? | intval / strval | Преобразование может потерять часть данных; оно не заменяет проверку. |
| Как хранить структуру? | serialize | Это PHP-формат; JSON удобнее для межъязыковой интеграции. |
HTTP-поля могут быть массивами: отправитель способен передать quantity[]=2. Поэтому не начинайте с intval($_POST["quantity"]). Сначала метод запроса, наличие, тип поля и правило допустимого значения — полная HTML-форма и её обработка.
Нужна ли установка расширения
Эта группа входит в стандартные возможности PHP. Для обычного приложения не требуется отдельный пакет Composer или PECL. Исключение — историческое имя is_real, удалённое в PHP 8. Наличие функции в справочнике не обещает её наличие во всех исторических версиях.
<?php
var_dump(function_exists("is_string"));
var_dump(function_exists("is_real"));
Ожидаемый результат
bool(true)
bool(false)
На PHP 8 первая проверка находит встроенную функцию, вторая показывает удалённый alias. function_exists принимает строковое имя. isset/empty/unset — конструкции языка, поэтому такой тест не проверяет их существование.
Две настройки восстановления данных
| Директива | По умолчанию / уровень | Назначение |
|---|---|---|
| unserialize_callback_func | не задана / INI_ALL | Имя callback для неизвестного класса при unserialize. Если callback не определён или не определил класс, появляется предупреждение. Для новых приложений изучите автозагрузку Composer. |
| unserialize_max_depth | 4096 / INI_ALL, PHP 7.4+ | Ограничение глубины восстановления. 0 отключает предел. options[max_depth] задаёт предел отдельного вызова. Это не защита от всех затрат памяти и не разрешение принимать чужую сериализацию. |
INI_ALL описывает разрешённый уровень изменения, а не полезность отключения защиты. Не меняйте настройку всего сайта ради одного известного маленького кеша. Подберите предел отдельного вызова и ограничьте размер входа. Где искать действующий php.ini, объясняется в конфигурации.
Показать на экране и вернуть результат — разные действия
- print_r($value, true) → создаёт строку.
- $description = … → сохраняет строку в переменной.
- Проверить и скрыть секреты → выбрать разрешённые поля.
- Только затем: локальный вывод или журнал.
var_dump печатает и не возвращает текст. print_r($value, true) и var_export($value, true) возвращают строку. Вывод диагностики перед JSON-ответом портит протокол; вывод перед header может мешать заголовкам. Объекты способны раскрыть private/protected данные, а __debugInfo меняет представление var_dump. Передавайте в журнал только нужные поля, а не весь запрос с токенами.
Подробности вывода и захвата в строку — буферизация вывода. Полученная строка не является HTML-экранированной: для HTML нужны правила безопасного вывода.
Когда удобная диагностика становится дорогой
Проверка типа обычного значения мала по объёму работы. Печать, экспорт и сериализация обходят структуру, создают большой текст и могут вызвать методы объекта. Не выполняйте их для всего каталога в каждом обороте импорта. is_countable не считает элементы, но сам count у Countable вызывает пользовательский метод; is_callable может запустить автозагрузку.
Счётчик ссылок debug_zval_dump не является числом переменных в вашей программе. Вызов влияет на наблюдаемый refcount, а оптимизации меняют детали. Для смысла общей ссылки сначала изучите модель двух имён одного значения.
Практика: не потерять ноль и не скрыть ошибку
- Сервис прислал stock=0. Ответ: не отбрасывайте его через empty; проверьте тип и допустимый диапазон.
- Форма прислала quantity="3items". Ответ: intval даст 3, но это не доказывает корректность поля. Проверяйте исходный формат до преобразования.
- Вместо списка из БД получена строка ошибки. Ответ: is_countable предотвращает неправильный count, но молчаливые 0 записей скроют сбой; найдите нарушенный контракт источника.
- Нужно передать корзину Python-сервису. Ответ: используйте JSON с проверкой ошибок и схемы, а не PHP serialize.
- После unset($alias) осталось исходное значение. Ответ: удалено одно имя, а не все владельцы значения; проследите ссылку и время жизни.
Все функции категории и исторические имена
Понять и показать значение
Проверить тип и доступное действие
is_arrayis_boolis_floatis_intis_nullis_numericis_objectis_resourceis_scalaris_stringis_callableis_countableis_iterable
Проверить наличие и удалить имя
Преобразовать значение
Исследовать открытый ресурс
Сохранить и восстановить PHP-данные
Прочитать старый код и выбрать основное имя
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
is_boolОтличить настоящий логический флаг от строки или числа.
PHP 4+ · standard
is_bool(mixed $value): boolКак использовать результат. В прикладном опыте false является допустимым значением флага. is_bool(false) возвращает true о типе; затем сам false выбирает подпись «Не отправлять». Это два разных логических вопроса.
Отличить настоящий логический флаг от строки или числа.
| Часть контракта | Что это означает |
|---|---|
| value: mixed | Уже полученное значение любого PHP-типа. Чтение неизвестной переменной происходит до вызова; функция не скрывает такое предупреждение. |
| Возврат: bool | Только true/false имеют тип bool. Значения 0, 1, "true", "false" не являются bool. |
| Изменение данных | Не преобразует и не заменяет value. true/false — ответ на конкретную проверку. |
<?php
var_dump(is_bool(false));
var_dump(is_bool(0));
var_dump(is_bool("false"));
Ожидаемый результат
bool(true)
bool(false)
bool(false)
false в первом вызове — проверяемое значение. Ответ true означает «тип действительно bool», а не «флаг включён».
Следующая ступень использует условия и циклы. Проверяем вход до действия; исключение сообщает о нарушенном договоре, а не исправляет данные автоматически.
<?php
$settings = ["notifications" => false];
$enabled = $settings["notifications"] ?? null;
if (!is_bool($enabled)) {
throw new InvalidArgumentException("Нужен логический флаг");
}
echo $enabled ? "Отправлять" : "Не отправлять";
Ожидаемый результат
Не отправлятьТак проверяют структуру внутренней конфигурации или JSON с настоящим false. Текстовое поле формы потребует разбора разрешённых значений. Тернарный оператор выбирает понятную человеку подпись.
Рядом: boolval, is_scalar. К основам: переменная и присваивание; тип значения.
is_floatУзнать, хранится ли значение как число с плавающей точкой.
PHP 4+ · standard
is_float(mixed $value): boolУзнать, хранится ли значение как число с плавающей точкой.
| Часть контракта | Что это означает |
|---|---|
| value: mixed | Уже полученное значение любого PHP-типа. Чтение неизвестной переменной происходит до вызова; функция не скрывает такое предупреждение. |
| Возврат: bool | Число 2.0 имеет тип float, хотя дробная часть нулевая; 2 и "2.0" — другие типы. INF и NAN также float, поэтому нужна проверка конечности. |
| Изменение данных | Не преобразует и не заменяет value. true/false — ответ на конкретную проверку. |
<?php
var_dump(is_float(2.0));
var_dump(is_float(2));
var_dump(is_float("2.0"));
Ожидаемый результат
bool(true)
bool(false)
bool(false)
Проверяется тип хранения значения, а не наличие значимых цифр после точки.
Следующая ступень использует условия и циклы. Проверяем вход до действия; исключение сообщает о нарушенном договоре, а не исправляет данные автоматически.
<?php
$measurements = [1.25, INF, '1.25'];
foreach ($measurements as $value) {
if (!is_float($value) || !is_finite($value) || $value < 0) {
echo "Измерение отклонено: нужен конечный неотрицательный float\n";
continue;
}
$twoPackages = $value * 2;
echo 'Масса одной упаковки: ', $value, ' кг; двух: ', $twoPackages, ' кг', "\n";
}
Ожидаемый результат
Масса одной упаковки: 1.25 кг; двух: 2.5 кг
Измерение отклонено: нужен конечный неотрицательный float
Измерение отклонено: нужен конечный неотрицательный float
Is_float разрешает первое значение и INF, но is_finite отклоняет INF. Строка 1.25 отклонена уже по типу. Только подходящее измерение используется в умножении и выводится с единицей измерения. Этот договор намеренно требует float; если источник допускает int, расширяют первую проверку явно.
Рядом: floatval, is_numeric, is_int. К основам: переменная и присваивание; тип значения.
is_nullПроверить отдельное значение null, отличая его от нуля и false.
PHP 4.0.4+ · standard
is_null(mixed $value): boolПроверить отдельное значение null, отличая его от нуля и false.
| Часть контракта | Что это означает |
|---|---|
| value: mixed | Уже полученное значение любого PHP-типа. Чтение неизвестной переменной происходит до вызова; функция не скрывает такое предупреждение. |
| Возврат: bool | true возвращается только для null. Неопределённая переменная сначала читается и может вызвать предупреждение; для её наличия используйте isset. |
| Изменение данных | Не преобразует и не заменяет value. true/false — ответ на конкретную проверку. |
<?php
$deliveryDate = null;
var_dump(is_null($deliveryDate));
var_dump(is_null(0));
var_dump(is_null(""));
Ожидаемый результат
bool(true)
bool(false)
bool(false)
null здесь означает «дата ещё не назначена», а не строку из четырёх букв.
Следующая ступень использует условия и циклы. Проверяем вход до действия; исключение сообщает о нарушенном договоре, а не исправляет данные автоматически.
<?php
$customer = ['name' => 'Анна', 'phone' => '+7 000 000-00-00'];
$update = ['phone' => null];
echo 'До изменения: ', $customer['phone'], "\n";
if (!array_key_exists('phone', $update)) {
echo "Телефон не меняется\n";
} elseif (is_null($update['phone'])) {
$customer['phone'] = null;
echo "Поле phone очищено по явному запросу\n";
} else {
echo "Новый телефон требует отдельной проверки формата\n";
}
echo 'После изменения: ', $customer['phone'] ?? 'телефон не указан', "\n";
Ожидаемый результат
До изменения: +7 000 000-00-00
Поле phone очищено по явному запросу
После изменения: телефон не указан
Array_key_exists различает отсутствующий ключ и существующий null. Is_null получает существующее значение и возвращает true; только тогда присваивается null в локальную карточку. При отсутствии ключа прежний телефон сохранился бы. Показан договор частичного обновления в памяти: записи в БД или отправки куда-либо нет. Для неизвестной переменной is_null не заменяет isset: аргумент будет прочитан до вызова.
Рядом: isset, empty. К основам: переменная и присваивание; тип значения.
is_objectОтличить объект от массива и остальных значений.
PHP 4+ · standard
is_object(mixed $value): boolОтличить объект от массива и остальных значений.
| Часть контракта | Что это означает |
|---|---|
| value: mixed | Уже полученное значение любого PHP-типа. Чтение неизвестной переменной происходит до вызова; функция не скрывает такое предупреждение. |
| Возврат: bool | Любой объект даёт true, включая __PHP_Incomplete_Class с PHP 7.2. Это не проверка конкретного класса, интерфейса, полномочий или валидности. |
| Изменение данных | Не преобразует и не заменяет value. true/false — ответ на конкретную проверку. |
<?php
$item = new stdClass();
var_dump(is_object($item));
var_dump(is_object([]));
Ожидаемый результат
bool(true)
bool(false)
new создаёт объект; stdClass — встроенный простой класс. [] создаёт массив, даже если его использовать как запись товара.
Следующая ступень использует условия и циклы. Проверяем вход до действия; исключение сообщает о нарушенном договоре, а не исправляет данные автоматически.
<?php
class ProductView
{
public string $name = "Чай";
}
$value = new ProductView();
if (is_object($value)) {
echo get_debug_type($value), "
";
}
if ($value instanceof ProductView) {
echo $value->name;
}
Ожидаемый результат
ProductView
ЧайДля диагностики достаточно «это объект»; для чтения ожидаемого свойства полезен конкретный instanceof. public разрешает внешний доступ, стрелка читает свойство. Для бизнес-клиента обычно проверяют интерфейс, а не любой объект.
Рядом: get_debug_type, is_array, is_callable. К основам: переменная и присваивание; тип значения.
is_resourceПроверить, что значение представляет ещё открытый ресурс PHP.
PHP 4+ · standard
is_resource(mixed $value): boolКак использовать результат. Is_resource проверяет доступ, а не читает данные. Полезную строку возвращает stream_get_contents; echo использует её. После fclose проверка ложна. Имя файла, числовой id и закрытый ресурс не заменяют открытый поток.
Проверить, что значение представляет ещё открытый ресурс PHP.
| Часть контракта | Что это означает |
|---|---|
| value: mixed | Уже полученное значение любого PHP-типа. Чтение неизвестной переменной происходит до вызова; функция не скрывает такое предупреждение. |
| Возврат: bool | Закрытый ресурс даёт false, хотя gettype продолжает сообщать resource (closed). Современные расширения могут возвращать объекты вместо ресурсов: сверяйте конкретный API. |
| Изменение данных | Не преобразует и не заменяет value. true/false — ответ на конкретную проверку. |
<?php
$stream = fopen("php://memory", "r+");
var_dump(is_resource($stream));
fclose($stream);
var_dump(is_resource($stream));
Ожидаемый результат
bool(true)
bool(false)
fopen открывает временный поток в памяти, r+ разрешает чтение и запись. fclose закрывает поток. После этого нельзя продолжать fwrite лишь потому, что переменная осталась.
Следующая ступень использует условия и циклы. Проверяем вход до действия; исключение сообщает о нарушенном договоре, а не исправляет данные автоматически.
<?php
$stream = fopen("php://memory", "r+");
try {
if (!is_resource($stream)) {
throw new RuntimeException("Поток не открыт");
}
fwrite($stream, "ready");
rewind($stream);
echo stream_get_contents($stream);
} finally {
if (is_resource($stream)) {
fclose($stream);
}
}
Ожидаемый результат
readyfinally освобождает ресурс и при исключении. Это учебный поток без сети; в реальном экспорте дополнительно проверяют неполную запись и ошибки чтения. Проверка ресурса не обещает права на запись или живое удалённое соединение.
Рядом: get_resource_type, get_resource_id, is_object. К основам: переменная и присваивание; тип значения.
is_scalarРазрешить только простые скалярные типы: bool, int, float, string.
PHP 4.0.5+ · standard
is_scalar(mixed $value): boolКак использовать результат. Is_scalar отвечает о группе типов. В экспорт попадают конкретные name и active; bool получает явные yes/no, а tags остаётся отдельной структурой. Возврат true не означает «можно без экранирования вставить в любой формат».
Разрешить только простые скалярные типы: bool, int, float, string.
| Часть контракта | Что это означает |
|---|---|
| value: mixed | Уже полученное значение любого PHP-типа. Чтение неизвестной переменной происходит до вызова; функция не скрывает такое предупреждение. |
| Возврат: bool | null, массив, объект и ресурс дают false. Объект с __toString также не скаляр. Проверка не ограничивает размер строки, диапазон числа или безопасность HTML. |
| Изменение данных | Не преобразует и не заменяет value. true/false — ответ на конкретную проверку. |
<?php
var_dump(is_scalar("SKU-2"));
var_dump(is_scalar(false));
var_dump(is_scalar(null));
var_dump(is_scalar([]));
Ожидаемый результат
bool(true)
bool(true)
bool(false)
bool(false)
Скаляр — категория типов, а не синоним «полезное непустое значение». Ложный bool остаётся скаляром.
Следующая ступень использует условия и циклы. Проверяем вход до действия; исключение сообщает о нарушенном договоре, а не исправляет данные автоматически.
<?php
$attributes = ["name" => "Чай", "active" => false, "tags" => ["food"]];
foreach ($attributes as $key => $value) {
if (!is_scalar($value)) {
echo $key, ": нужен отдельный формат
";
continue;
}
$text = is_bool($value) ? ($value ? "yes" : "no") : strval($value);
echo $key, ": ", $text, "
";
}
Ожидаемый результат
name: Чай
active: no
tags: нужен отдельный формат
Локальный текстовый экспорт принимает простые атрибуты. bool получает явные yes/no, иначе false пропал бы в пустой строке. Массив тегов требует отдельной сериализации. Для CSV/HTML нужны соответствующие экранирование и форматирование.
Рядом: is_string, is_bool, strval. К основам: переменная и присваивание; тип значения.
is_callableПроверить, можно ли вызвать значение как функцию в текущем контексте.
PHP 4.0.6+ · standard
is_callable(mixed $value, bool $syntax_only = false, string &$callable_name = null): boolКак использовать результат. Первый результат — можно ли вызвать значение. Вызов transform("tea") затем действительно выполняет действие и возвращает TEA. Syntax_only = true проверяет только допустимую форму записи: этого недостаточно для запуска.
Проверить, можно ли вызвать значение как функцию в текущем контексте.
| Часть контракта | Что это означает |
|---|---|
| value | Строковое имя, callback-массив, Closure или вызываемый объект. |
| syntax_only = false | true ограничивает проверку допустимой формой; это более слабая проверка. |
| callable_name | Необязательная выходная переменная, заполняемая по ссылке. |
| Возврат | bool. Вызов тела callback этой проверкой не выполняется; автозагрузка возможна. |
Скобки вызова после строковой переменной используют её значение как имя функции. is_callable проверяет возможность вызова из текущей области доступа, но не число/типы нужных аргументов и не безопасность выбранного действия.
<?php
$transform = "strtoupper";
var_dump(is_callable($transform));
echo $transform("tea");
Ожидаемый результат
bool(true)
TEAВ первом вызове имя только проверили. Во втором скобки реально вызывают strtoupper; результатом является новая строка.
<?php
$name = "manual_missing_transform";
var_dump(is_callable($name, true, $description));
var_dump(is_callable($name));
echo $description;
Ожидаемый результат
bool(true)
bool(false)
manual_missing_transformsyntax_only=true проверяет форму, поэтому произвольная строка проходит. Третий параметр передан по ссылке: функция записывает туда описательное имя. Оно не гарантирует существование функции или статичность метода.
<?php
$transforms = ["upper" => static fn (string $text): string => strtoupper($text)];
$selected = "upper";
$transform = $transforms[$selected] ?? null;
if (!is_callable($transform)) {
throw new InvalidArgumentException("Неизвестное преобразование");
}
echo $transform("tea");
Ожидаемый результат
TEAЭто следующая ступень: fn создаёт короткую функцию, string описывает её вход и выход. Пользователь выбирает ключ из списка, а не произвольное имя PHP-функции. Разрешённость вызова ещё не гарантирует, что само тело не выбросит исключение.
Для метода объекта используют [$object, "method"], для статического — [ClassName::class, "method"]. Нестатический метод нельзя вызывать через строку класса в PHP 8. Возможны автозагрузка, __invoke и __call; __call может дать true для имени, которого нет как отдельного метода. method_exists отвечает о наличии метода, а не о доступности вызова.
Рядом: is_object, is_string. К основам: переменная и присваивание; тип значения.
is_countableПроверить допустимость значения для count, не считая элементы.
PHP 7.3+ · standard
is_countable(mixed $value): boolКак использовать результат. Ответ true разрешает вызов count, но не содержит само количество. Count затем получает размер и может вызвать пользовательский метод объекта. Для генератора вычисление количества обходом потребляет поток: дальнейший показ тех же данных требует отдельного решения.
Проверить допустимость значения для count, не считая элементы.
| Часть контракта | Что это означает |
|---|---|
| value | Любой тип. |
| true | Массив или объект Countable. |
| false | В том числе строка, null и обычный Generator. |
<?php
var_dump(is_countable(["tea", "bread"]));
var_dump(is_countable("tea"));
Ожидаемый результат
bool(true)
bool(false)
Для длины строки нужны strlen/mb_strlen, не count. Сама is_countable не обходит элементы массива.
<?php
function orderIds(): Generator
{
yield 41;
yield 42;
}
$orders = orderIds();
var_dump(is_iterable($orders));
var_dump(is_countable($orders));
foreach ($orders as $id) {
echo $id, "
";
}
Ожидаемый результат
bool(true)
bool(false)
41
42
yield выдаёт значения по одному; Generator не реализует Countable. Проверки не потребили генератор. Отдельный полный подсчёт обходом потратил бы время и мог бы исчерпать одноразовый источник. Подробности — в главе генераторов.
Объект с интерфейсом Countable даст true; его метод count может выполнять произвольную работу и бросать исключение. Не превращайте строку ошибки БД в «0 результатов», молча заменяя любое несчитаемое значение пустым массивом.
Рядом: is_iterable, is_array. К основам: переменная и присваивание; тип значения.
is_iterableПроверить договор array или Traversable перед передачей в перебор.
PHP 7.1+ · standard
is_iterable(mixed $value): boolКак использовать результат. True разрешает договор array или Traversable; реальный foreach затем получает очередное значение. Проверка не выполняет обход заранее, не обещает его конечность и не проверяет типы элементов.
Проверить договор array или Traversable перед передачей в перебор.
| Часть контракта | Что это означает |
|---|---|
| value | Любое значение. |
| Возврат | true для array/Traversable; false для остальных. |
| Побочные действия | Не запускает foreach и не проверяет содержимое элементов. |
<?php
var_dump(is_iterable(["TEA"]));
var_dump(is_iterable("TEA"));
var_dump(is_iterable(new stdClass()));
Ожидаемый результат
bool(true)
bool(false)
bool(false)
iterable означает array или Traversable. foreach способен читать видимые свойства обычного объекта, но такой объект не удовлетворяет типу iterable; это важное различие договоров.
<?php
function printCodes(iterable $codes): void
{
foreach ($codes as $code) {
echo $code, "
";
}
}
$source = new ArrayIterator(["TEA", "BREAD"]);
if (is_iterable($source)) {
printCodes($source);
}
Ожидаемый результат
TEA
BREAD
ArrayIterator оборачивает массив и поддерживает Traversable. Тип iterable разрешает единый вход для массива, итератора и генератора. Он не гарантирует тип каждого элемента, повторяемость прохода или конечность потока.
Рядом: is_array, is_countable. К основам: переменная и присваивание; тип значения.
issetУзнать, существует ли переменная или элемент со значением, отличным от null.
PHP 4+ · Core
isset($var, ...$vars): bool — конструкция языкаУзнать, существует ли переменная или элемент со значением, отличным от null.
| Часть контракта | Что это означает |
|---|---|
| var, vars | Одна или несколько проверяемых переменных/элементов. |
| Возврат | true только если все существуют и не null. false не различает отсутствующее имя и явно заданный null. |
<?php
$stock = 0;
$delivery = null;
var_dump(isset($stock));
var_dump(isset($delivery));
var_dump(isset($missing));
Ожидаемый результат
bool(true)
bool(false)
bool(false)
Необъявленный missing проверяется без предупреждения: isset — конструкция языка, а не обычная функция, читающая аргумент заранее.
<?php
$customer = ['name' => 'Анна', 'phone' => null];
if (isset($customer['name'], $customer['phone'])) {
echo 'Контакт готов: ', $customer['name'], ', ', $customer['phone'], "\n";
} else {
echo "Контакт ещё не заполнен полностью\n";
}
if (array_key_exists('phone', $customer)) {
echo "Поле телефона предусмотрено в карточке\n";
}
$phoneLabel = $customer['phone'] ?? 'не указан';
echo 'Покупатель: ', $customer['name'], '; телефон: ', $phoneLabel, "\n";
Ожидаемый результат
Контакт ещё не заполнен полностью
Поле телефона предусмотрено в карточке
Покупатель: Анна; телефон: не указан
Многоаргументный isset требует оба существующих ненулевых значения: name подходит, phone=null останавливает проверку с false. Array_key_exists подтверждает ключ отдельно. Последнее ?? возвращает строку для отображения, не заполняя phone автоматически. Даже true от isset не доказывало бы строковый тип или допустимый номер.
При недоступных свойствах объекта может вызываться __isset. isset у нетронутого типизированного свойства даёт false. Проверка строкового смещения не превращает строку в массив. Не передавайте выражения вроде isset(strval(3)): проверяются переменные/доступ к ним. Нельзя вызвать isset через имя в переменной или named arguments.
Рядом: is_null, empty, unset. К основам: переменная и присваивание; тип значения.
emptyПроверить отсутствие или ложное значение, когда это соответствует задаче.
PHP 4+ · Core
empty($var): bool — конструкция языкаПроверить отсутствие или ложное значение, когда это соответствует задаче.
| Часть контракта | Что это означает |
|---|---|
| var | Проверяемое значение/выражение; необъявленные переменные и вложенные обращения не требуют предварительного isset. |
| Возврат | true для отсутствующего или falsey-значения; false для остальных. |
<?php
var_dump(empty(""));
var_dump(empty("0"));
var_dump(empty(0));
var_dump(empty(" "));
var_dump(empty($missing));
Ожидаемый результат
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
Пробел является непустой строкой. Строка "0" считается ложной. Неизвестное имя не вызывает предупреждение.
<?php
$quote = ["delivery" => 0];
if (empty($quote["delivery"])) {
echo "empty не отличил бесплатную доставку
";
}
if (array_key_exists("delivery", $quote) && is_int($quote["delivery"])) {
echo "Цена доставки: ", $quote["delivery"];
}
Ожидаемый результат
empty не отличил бесплатную доставку
Цена доставки: 0Ноль — осмысленный результат расчёта, поэтому выбираем существование ключа и тип. empty подходит, когда все ложные значения действительно объединяются вашим правилом; оно не является общей валидацией формы.
Ложные значения: false, null, 0, 0.0/−0.0, "", "0", пустой массив; отсутствующее значение также даёт true. Выражения разрешены с PHP 5.5. Для недоступных свойств сначала участвует __isset; для некоторых перегруженных объектов результат требует знания их контракта. Как конструкция языка empty не вызывается переменной-функцией.
Рядом: isset, is_null, boolval. К основам: переменная и присваивание; тип значения.
unsetУдалить переменную, элемент или допустимое свойство из текущего контекста.
PHP 4+ · Core
unset($var, ...$vars): void — конструкция языкаУдалить переменную, элемент или допустимое свойство из текущего контекста.
| Часть контракта | Что это означает |
|---|---|
| var, vars | Удаляемые переменные/элементы, перечисленные через запятую. |
| Результат | Нет возвращаемого значения; не применяют как выражение. Это не равнозначно присваиванию null. |
<?php
$items = [0 => 'Чай', 1 => 'Кофе'];
$cancelled = $items[0];
unset($items[0]);
echo 'Отменён товар: ', $cancelled, "\n";
foreach ($items as $key => $name) {
echo 'Оставшийся ключ ', $key, ': ', $name, "\n";
}
$listForDisplay = array_values($items);
echo 'Первая позиция нового списка: ', $listForDisplay[0], "\n";
$temporary = 'Готово';
unset($temporary);
if (!isset($temporary)) {
echo "Временное имя очищено\n";
}
Ожидаемый результат
Отменён товар: Чай
Оставшийся ключ 1: Кофе
Первая позиция нового списка: Кофе
Временное имя очищено
Unset ничего не возвращает, поэтому отменённое название сохранено до удаления. Ключ 1 не переехал автоматически в 0. Array_values возвращает новый последовательный массив в listForDisplay; исходные items по-прежнему имеют ключ 1. Последний unset удаляет только имя temporary, не файл и не запись базы.
<?php
$stock = 5;
$editable =& $stock;
$editable = 3;
unset($editable);
$editable = 100;
echo $stock, "
", $editable;
Ожидаемый результат
3
100=& связывает два имени. unset разрывает связь только для editable; новая запись создаёт независимую переменную. Это полезно после foreach по ссылке, чтобы не менять последний элемент следующей записью.
В функции unset параметра по ссылке удаляет локальное имя, а не переменную вызывающего кода. С global аналогично: удаление глобального элемента выполняется через $GLOBALS, когда это явно нужно. unset локального static не стирает сохранённое значение между вызовами. Объект живёт, пока на него есть владельцы; циклы и сборщик мусора усложняют освобождение, а RSS процесса не обязан немедленно уменьшаться. __unset может перехватывать недоступное свойство; инициализированное readonly-свойство просто удалить нельзя.
Рядом: isset, is_null. К основам: переменная и присваивание; тип значения.
is_doubleИсторическое альтернативное имя is_float; полезно при чтении существующего проекта.
PHP 4+; доступен в проверенном PHP 8.5 · standard
is_double(mixed $value): boolИсторическое альтернативное имя is_float; полезно при чтении существующего проекта.
| Часть контракта | Что это означает |
|---|---|
| value | Любой тип; правила полностью совпадают с is_float. |
| Возврат | bool. Самостоятельного long/integer/double-типа alias не добавляет. |
<?php
var_dump(is_double(2.5));
var_dump(is_double("2.5"));
Ожидаемый результат
bool(true)
bool(false)
Это alias, а не другой диапазон чисел или более строгая проверка. Строка остаётся строкой.
<?php
$value = 2.5;
$oldCheck = is_double($value);
$currentCheck = is_float($value);
var_dump($oldCheck === $currentCheck);
Ожидаемый результат
bool(true)
При сопровождении можно заменить имя на основное, сохранив договор проверки. Сверяйте реальные тесты приложения; этот пример показывает только равенство результата на указанном входе.
Рядом: is_float. К основам: переменная и присваивание; тип значения.
is_integerИсторическое альтернативное имя is_int; полезно при чтении существующего проекта.
PHP 4+; доступен в проверенном PHP 8.5 · standard
is_integer(mixed $value): boolИсторическое альтернативное имя is_int; полезно при чтении существующего проекта.
| Часть контракта | Что это означает |
|---|---|
| value | Любой тип; правила полностью совпадают с is_int. |
| Возврат | bool. Самостоятельного long/integer/double-типа alias не добавляет. |
<?php
var_dump(is_integer(2));
var_dump(is_integer("2"));
Ожидаемый результат
bool(true)
bool(false)
Это alias, а не другой диапазон чисел или более строгая проверка. Строка остаётся строкой.
<?php
$value = 2;
$oldCheck = is_integer($value);
$currentCheck = is_int($value);
var_dump($oldCheck === $currentCheck);
Ожидаемый результат
bool(true)
При сопровождении можно заменить имя на основное, сохранив договор проверки. Сверяйте реальные тесты приложения; этот пример показывает только равенство результата на указанном входе.
Рядом: is_int. К основам: переменная и присваивание; тип значения.
is_longИсторическое альтернативное имя is_int; полезно при чтении существующего проекта.
PHP 4+; доступен в проверенном PHP 8.5 · standard
is_long(mixed $value): boolИсторическое альтернативное имя is_int; полезно при чтении существующего проекта.
| Часть контракта | Что это означает |
|---|---|
| value | Любой тип; правила полностью совпадают с is_int. |
| Возврат | bool. Самостоятельного long/integer/double-типа alias не добавляет. |
<?php
var_dump(is_long(2));
var_dump(is_long("2"));
Ожидаемый результат
bool(true)
bool(false)
Это alias, а не другой диапазон чисел или более строгая проверка. Строка остаётся строкой.
<?php
$value = 2;
$oldCheck = is_long($value);
$currentCheck = is_int($value);
var_dump($oldCheck === $currentCheck);
Ожидаемый результат
bool(true)
При сопровождении можно заменить имя на основное, сохранив договор проверки. Сверяйте реальные тесты приложения; этот пример показывает только равенство результата на указанном входе.
Рядом: is_int. К основам: переменная и присваивание; тип значения.
is_realУдалённый alias is_float: читать старый код и переносить на основное имя.
PHP 4–7; удалена в PHP 8.0 · standard
Исторически is_real(mixed $value): bool; отсутствует в PHP 8Удалённый alias is_float: читать старый код и переносить на основное имя.
| Часть контракта | Что это означает |
|---|---|
| Статус | Deprecated с PHP 7.4; удалена в PHP 8.0. |
| Замена | is_float с теми же правилами проверки типа. |
<?php
var_dump(function_exists("is_real"));
var_dump(is_float(1.5));
Ожидаемый результат
bool(false)
bool(true)
В PHP 8 is_real удалена; прямой вызов неизвестного имени вызвал бы Error. Основное имя — is_float.
<?php
$temperature = 18.5;
if (is_float($temperature) && is_finite($temperature)) {
echo "Конечное измерение";
}
Ожидаемый результат
Конечное измерениеПри переносе старого проекта заменяют alias, затем проверяют предметные ограничения. is_float не гарантирует конечность и допустимый диапазон датчика.
Рядом: is_float. К основам: переменная и присваивание; тип значения.
boolvalПолучить логическое значение по правилам PHP, когда именно эти правила подходят задаче.
PHP 5.5+ · standard
boolval(mixed $value): boolПолучить логическое значение по правилам PHP, когда именно эти правила подходят задаче.
| Часть контракта | Что это означает |
|---|---|
| value | Любое значение; исходник не изменяется. |
| Возврат | bool по обычным правилам приведения, а не результат проверки формата. |
<?php
var_dump(boolval(0));
var_dump(boolval("0"));
var_dump(boolval("false"));
var_dump(boolval([]));
Ожидаемый результат
bool(false)
bool(false)
bool(true)
bool(false)
boolval применяет обычные правила приведения к bool. Она не разбирает английские слова true/false. [] — пустой массив; непустой массив дал бы true.
<?php
$raw = 'false';
$coerced = boolval($raw);
echo 'После простого boolval: ', $coerced ? 'уведомления включены' : 'уведомления выключены', "\n";
$allowed = ['true' => true, 'false' => false];
if (!array_key_exists($raw, $allowed)) {
throw new InvalidArgumentException('Нужны true или false');
}
$enabled = $allowed[$raw];
echo 'После разбора согласованного словаря: ', $enabled ? 'уведомления включены' : 'уведомления выключены', "\n";
Ожидаемый результат
После простого boolval: уведомления включены
После разбора согласованного словаря: уведомления выключены
Boolval вернул true: строка false непуста и не равна строке 0. Вторая часть использует две явно согласованные записи и получает bool false по ключу false. Результат enabled управляет подписью; отправка уведомлений не выполняется. Если протокол принимает 0/1 или другие записи, их задают отдельно.
Для PHP false также получаются из null, числового нуля, пустой строки и "0"; большинство объектов дают true, но у внутренних классов возможны специальные правила. Приведение не изменяет исходную переменную. Для настоящего флага из JSON чаще нужен is_bool; явная запись (bool) выражает то же приведение.
Рядом: is_bool, empty. К основам: переменная и присваивание; тип значения.
floatvalПолучить float, понимая допустимые потери и формат исходника.
PHP 4.2+ · standard
floatval(mixed $value): floatПолучить float, понимая допустимые потери и формат исходника.
| Часть контракта | Что это означает |
|---|---|
| value | Значение, приводимое к float; обычно проверенная числовая строка или число. |
| Возврат | float; неподходящий текст может превратиться в 0, переполнение — в бесконечность. |
| Ошибка | Преобразование обычного объекта вызывает E_WARNING в PHP 8; это не валидатор. |
<?php
var_dump(floatval("2.75"));
var_dump(floatval("2.75 kg"));
var_dump(floatval("kg 2.75"));
var_dump(floatval("2,75"));
Ожидаемый результат
float(2.75)
float(2.75)
float(0)
float(2)
Преобразование может остановиться на неподходящем символе. Поэтому успешное получение float не доказывает, что вся строка соответствовала ожидаемому числу.
<?php
$raw = '2.75';
if (!is_string($raw) || !is_numeric($raw)) {
throw new InvalidArgumentException('Вес должен быть числовой строкой');
}
$weightKg = floatval($raw);
if (!is_finite($weightKg) || $weightKg <= 0 || $weightKg > 30) {
throw new InvalidArgumentException('Недопустимый вес');
}
$totalWeightKg = $weightKg * 2;
echo 'Исходный текст: ', $raw, ' (', get_debug_type($raw), ')', "\n";
echo 'Масса двух мест: ', $totalWeightKg, ' кг', "\n";
Ожидаемый результат
Исходный текст: 2.75 (string)
Масса двух мест: 5.5 кг
Floatval получает проверенную строку, возвращает float 2.75 в weightKg; raw остаётся строкой. После проверки конечности и диапазона умножение даёт 5.5. Числовой синтаксис PHP — договор этого примера, включая экспоненту; он не подходит автоматически для местной записи с запятой или цен с разделителем тысяч.
Пустой массив приводится к 0, непустой к 1: это ещё одна причина заранее проверить тип. Обычный объект не является корректным входом для такого преобразования: возникает E_WARNING. Дроби имеют погрешность; floatval не является валютным парсером, округлением или гарантией конечного результата. Для денег рассмотрите целые минимальные единицы либо десятичную арифметику.
Рядом: is_float, is_numeric, doubleval, intval. К основам: переменная и присваивание; тип значения.
doublevalАльтернативное имя floatval для чтения и сопровождения кода.
PHP 4+ · standard
doubleval(mixed $value): floatАльтернативное имя floatval для чтения и сопровождения кода.
| Часть контракта | Что это означает |
|---|---|
| value / результат | Полностью совпадают с floatval. |
| Тип | PHP float; отдельного пользовательского double-типа это имя не создаёт. |
<?php
var_dump(doubleval("1.5"));
var_dump(doubleval("1.5 units"));
Ожидаемый результат
float(1.5)
float(1.5)
doubleval — alias floatval, а не более точная десятичная арифметика. Даже текст с припиской может дать число.
<?php
$raw = "3.25";
$old = doubleval($raw);
$current = floatval($raw);
var_dump($old === $current);
echo $current;
Ожидаемый результат
bool(true)
3.25При сопровождении старого кода можно использовать основное имя floatval. Все требования проверки входа, конечности и погрешности сохраняются; переименование не исправляет денежные расчёты.
Рядом: floatval, is_float. К основам: переменная и присваивание; тип значения.
strvalПолучить простое строковое представление допустимого значения.
PHP 4+ · standard
strval(mixed $value): stringПолучить простое строковое представление допустимого значения.
| Часть контракта | Что это означает |
|---|---|
| value | Обычно скаляр, null или объект с __toString. |
| Возврат | string без прикладного форматирования и экранирования. |
| Ошибки | Неподходящие массивы/объекты требуют другого способа представления. |
<?php
var_dump(strval(41));
var_dump(strval(true));
var_dump(strval(false));
var_dump(strval(null));
Ожидаемый результат
string(2) "41"
string(1) "1"
string(0) ""
string(0) ""
Получен новый string. true становится "1", а false/null — пустой строкой. Если нужны буквальные yes/no или true/false, задайте это правило явно.
<?php
$orderId = 41;
$reference = "ORDER-" . strval($orderId);
echo $reference, "
";
$enabled = false;
echo $enabled ? "enabled" : "disabled";
Ожидаемый результат
ORDER-41
disabledТочка сцепляет строки. Для флага выбран отдельный словарь вывода, чтобы значение не исчезло. Формат цены с двумя знаками требует форматтера, strval сам его не добавит.
<?php
class OrderReference
{
public function __toString(): string
{
return "ORDER-41";
}
}
$reference = new OrderReference();
echo strval($reference);
Ожидаемый результат
ORDER-41__toString — метод, возвращающий строку при соответствующем преобразовании. Это уже раздел ООП: метод может иметь собственные ошибки; любой произвольный объект строкой не становится.
Для массива будет предупреждение Array to string conversion и бесполезное представление Array; выбирайте JSON либо специально построенный текст. Объект без __toString вызывает Error. Ресурс печатается техническим обозначением, не его содержимым. Формат float зависит от precision и может быть экспоненциальным; это не стабильный формат денежного обмена. Никакого HTML/SQL-экранирования strval не делает.
Рядом: is_string, is_scalar, serialize. К основам: переменная и присваивание; тип значения.
settypeИзменить тип переданной переменной, явно учитывая изменение по ссылке.
PHP 4+ · standard
settype(mixed &$var, string $type): boolИзменить тип переданной переменной, явно учитывая изменение по ссылке.
| Часть контракта | Что это означает |
|---|---|
| var | Изменяемая переменная; & обозначает передачу по ссылке. |
| type | Одно из поддерживаемых строковых имён типа. |
| Возврат / ошибка | В PHP 8 при успехе true, для неизвестного имени ValueError; ограничения свойства могут вызвать TypeError. |
<?php
$quantity = "12";
$success = settype($quantity, "int");
var_dump($success);
var_dump($quantity);
Ожидаемый результат
bool(true)
int(12)
var передаётся по ссылке: settype меняет quantity. Переменная success содержит true, а не 12. С (int) $quantity можно получить новое значение без изменения исходника.
<?php
$value = "12";
try {
settype($value, "decimal");
} catch (ValueError $error) {
echo "Такого типа у settype нет
";
}
var_dump($value);
Ожидаемый результат
Такого типа у settype нет
string(2) "12"
try содержит рискованный вызов, catch принимает ValueError и объясняет ошибку. PHP 8 не возвращает false для неизвестного типа. decimal не является названием типа, понятным settype.
<?php
$raw = '3';
$permitted = ['1', '2', '3', '4', '5'];
if (!in_array($raw, $permitted, true)) {
throw new InvalidArgumentException('Нужна одна из строк 1, 2, 3, 4, 5');
}
$normalized = $raw;
$success = settype($normalized, 'int');
if (!$success) {
throw new RuntimeException('Преобразование не выполнено');
}
echo 'Для журнала: ', $raw, ' (', get_debug_type($raw), ')', "\n";
echo 'Для модуля: ', $normalized, ' (', get_debug_type($normalized), ')', "\n";
echo 'Всего в трёх одинаковых наборах: ', $normalized * 3, ' шт.', "\n";
Ожидаемый результат
Для журнала: 3 (string)
Для модуля: 3 (int)
Всего в трёх одинаковых наборах: 9 шт.
In_array с третьим true ищет строгое совпадение в маленьком согласованном словаре. Raw скопирован, поэтому settype изменяет только normalized на int 3. Его возврат true хранится в success отдельно; расчёт использует normalized и даёт 9. При известном целевом типе обычный (int) часто яснее; динамический settype нужен лишь когда API требует именно такую мутацию.
<?php
class BatchSettings
{
public int $limit = 12;
}
$settings = new BatchSettings();
var_dump(settype($settings->limit, "string"));
var_dump($settings->limit);
Ожидаемый результат
bool(true)
int(12)
Здесь обычный режим без strict_types=1. settype получила строку "12", но присваивание в int-свойство привело её обратно к int. true не гарантирует, что свойство теперь имеет запрошенный строковый тип. С неподходящим значением или в строгом режиме возможен TypeError; не используйте settype для обхода договора свойства.
Допустимы bool/boolean, int/integer, float/double, string, array, object, null. Нельзя передать литерал как изменяемую переменную. Ссылка на типизированное свойство сохраняет ограничения его типа: неподходящее присваивание может вызвать TypeError, а допустимое в обычном режиме может снова привести значение к объявленному типу. Массив/объект при приведении получают правила языка, а не проверку схемы. Изменяя alias, вы меняете и связанное значение.
Рядом: intval, floatval, strval, boolval. К основам: переменная и присваивание; тип значения.
gettypeПолучить историческое строковое название типа, например для совместимого отчёта.
PHP 4+ · standard
gettype(mixed $value): stringПолучить историческое строковое название типа, например для совместимого отчёта.
| Часть контракта | Что это означает |
|---|---|
| value | Любое уже полученное значение. |
| Возврат | Строка с именем типа. Для условия обычно удобнее is_*; для нового диагностического текста — get_debug_type. |
<?php
echo gettype(12), "
";
echo gettype(1.5), "
";
echo gettype(false), "
";
echo gettype(null);
Ожидаемый результат
integer
double
boolean
NULLdouble здесь обозначает PHP float, а NULL записывается в верхнем регистре. Это договор старой функции, не новые типы языка.
<?php
$value = new stdClass();
echo gettype($value), "
";
echo get_debug_type($value), "
";
var_dump(is_object($value));
Ожидаемый результат
object
stdClass
bool(true)
gettype говорит об общей категории, get_debug_type уточняет класс, is_object возвращает логический ответ. Выбор зависит от того, нужен текст диагностики или условие программы.
Другие результаты: string, array, resource, resource (closed), unknown type. Закрытые ресурсы имеют специальное имя с PHP 7.2. Возвращённая строка не является полной проверкой структуры объекта, доступных методов или формата строки.
Рядом: get_debug_type, is_object, var_dump. К основам: переменная и присваивание; тип значения.
var_dumpПосмотреть типы и значения при локальной отладке.
PHP 4+ · standard
var_dump(mixed $value, mixed ...$values): voidКак использовать результат. Параметры передаются для наблюдения; функция сама выводит типы и значения, не возвращая готовую строку для вставки в отчёт. Поэтому диагностику отделяют от полезного результата приложения и при необходимости захватывают вывод осознанно.
Посмотреть типы и значения при локальной отладке.
| Часть контракта | Что это означает |
|---|---|
| value, values | Одно или несколько значений; ... в сигнатуре означает дополнительные аргументы. |
| Действие | Печатает представление с типами. Не возвращает строку для присваивания. |
<?php
var_dump(0, "0", null);
Ожидаемый результат
int(0)
string(1) "0"
NULL
Через запятую передаются несколько аргументов. string(1) показывает длину в байтах; это не универсальное количество букв для UTF-8. var_dump печатает непосредственно, её возврат — null при использовании в выражении.
<?php
$line = ["sku" => "TEA", "stock" => 0];
ob_start();
var_dump($line);
$debugText = ob_get_clean();
echo "Сохранён текст: ", is_string($debugText) ? "да" : "нет", "
";
echo $debugText;
Ожидаемый результат
Сохранён текст: да
array(2) {
["sku"]=>
string(3) "TEA"
["stock"]=>
int(0)
}
ob_start включает буфер, ob_get_clean возвращает и закрывает именно этот буфер. В реальном JSON-обработчике не выводите debugText вместе с JSON: сохраните ограниченную диагностику в журнал. Здесь echo нужен, чтобы увидеть результат учебного опыта.
Массивы и объекты исследуются рекурсивно; __debugInfo объекта может изменить показываемые данные и выполнить код. По умолчанию могут раскрываться private/protected свойства. Идентификаторы объектов и детали форматирования зависят от окружения, особенно при отладочных расширениях. Объём вывода растёт со структурой; для большого ответа API выбирайте несколько полей.
Рядом: print_r, var_export, get_debug_type. К основам: переменная и присваивание; тип значения.
print_rБыстро показать структуру или получить её читаемое текстовое представление.
PHP 4+; string|true в сигнатуре с PHP 8.4 · standard
print_r(mixed $value, bool $return = false): string|trueКак использовать результат. При return = true функция отдаёт диагностический текст в присваивание; без этого флага печатает сразу. Поэтому сохранённую строку можно добавить к локальному отчёту, а сам возврат true от режима печати не является текстом данных.
Быстро показать структуру или получить её читаемое текстовое представление.
| Часть контракта | Что это означает |
|---|---|
| value | Значение, массив или объект для просмотра. |
| return | false — печатать; true — вернуть строку. |
| Возврат | true после печати либо сформированная строка. |
<?php
print_r(["sku" => "TEA", "stock" => 0]);
Ожидаемый результат
Array
(
[sku] => TEA
[stock] => 0
)
Ключи и значения удобны для быстрого просмотра, но подробных типов нет. false и пустая строка выглядят похоже; для такой ошибки используйте var_dump.
<?php
$order = ["id" => 41, "status" => "new", "internalToken" => "demo-only"];
$publicDebug = ["id" => $order["id"], "status" => $order["status"]];
$text = print_r($publicDebug, true);
var_dump(is_string($text));
echo $text;
Ожидаемый результат
bool(true)
Array
(
[id] => 41
[status] => new
)
Второй аргумент true возвращает строку вместо немедленной печати. Поля выбраны явно: технический токен не попадает в представление. Даже такой текст экранируйте перед включением в HTML.
При return=false функция печатает и возвращает true; при true возвращает string. С PHP 8.4 тип возврата уточнён до string|true, раньше обозначался string|bool. Представление объекта может раскрывать закрытые свойства; это не экспорт для последующего восстановления и не JSON. Не разбирайте print_r обратно регулярными выражениями.
Рядом: var_dump, var_export, serialize. К основам: переменная и присваивание; тип значения.
var_exportПолучить представление значения как PHP-выражение для контролируемых фикстур и диагностики.
PHP 4.2+ · standard
var_export(mixed $value, bool $return = false): ?stringКак использовать результат. Возвращённая строка похожа на исходный PHP-код. Она полезна для контролируемого файла настройки, но объекты и циклы имеют ограничения. Сохранение этой строки не разрешает исполнять произвольный пользовательский текст.
Получить представление значения как PHP-выражение для контролируемых фикстур и диагностики.
| Часть контракта | Что это означает |
|---|---|
| value | Экспортируемое значение; ограничение для ресурсов/циклов/объектов нужно учитывать. |
| return | true возвращает строку, false печатает её. |
| Возврат | string при return=true, иначе null. Выполнение этого текста не происходит. |
<?php
$enabled = false;
$code = var_export($enabled, true);
var_dump($code);
echo $code;
Ожидаемый результат
string(5) "false"
falsestrval(false) вернула бы пустую строку. var_export создаёт текст PHP-выражения false; его имя code здесь обозначает строку, она сама не исполняется.
<?php
$config = ["limit" => 20, "enabled" => false];
$source = "<?php
return " . var_export($config, true) . ";
";
echo $source;
Ожидаемый результат
<?php
return array (
'limit' => 20,
'enabled' => false,
);
Так инструмент сборки может подготовить проверяемый файл с собственными настройками. Пример лишь печатает строку; не вызывает eval, не записывает и не подключает чужой код. Фикстуру сохраняют вне публичных загрузок, пересматривают и контролируют права.
Без return=true вывод печатается, возврат null. Ресурсы и циклические ссылки не восстанавливаются таким экспортом. Для пользовательских объектов генерируемая форма обычно требует __set_state; stdClass экспортируется приведением массива к объекту. В PHP 8.2 имена классов в экспорте полностью квалифицированы. Сам факт получения текста не гарантирует существование метода восстановления; сериализация и JSON решают другие задачи.
Рядом: print_r, serialize, strval. К основам: переменная и присваивание; тип значения.
debug_zval_dumpИсследовать внутреннее представление значения, понимая влияние самого наблюдения.
PHP 4.2+; packed-маркер массивов с PHP 8.4 · standard
debug_zval_dump(mixed $value, mixed ...$values): voidИсследовать внутреннее представление значения, понимая влияние самого наблюдения.
| Часть контракта | Что это означает |
|---|---|
| value, values | Одно или несколько значений. |
| Действие | Печатает внутреннее диагностическое представление; текст не возвращается. |
| Граница | refcount не равен числу PHP-переменных и не является проверкой ссылки &. |
<?php
debug_zval_dump(7, false);
Ожидаемый результат
int(7)
bool(false)
int и bool не используют copy-on-write как массивы/строки; ожидать refcount у каждого типа неправильно. Функция предназначена для исследования устройства движка.
<?php
$text = "ORDER-" . strval(2);
$copy = $text;
ob_start();
debug_zval_dump($text);
$diagnostic = ob_get_clean();
var_dump(str_contains($diagnostic, 'string(7) "ORDER-2"'));
$copy .= "-COPY";
echo $text, "
", $copy;
Ожидаемый результат
bool(true)
ORDER-2
ORDER-2-COPYБуфер сохраняет наблюдаемый dump для локального просмотра. Проверяем смысл значения, не число владельцев: сама передача аргумента влияет на refcount, а интернирование/оптимизации меняют детали. Изменение copy не изменило text. Этот опыт не измеряет производительность или физический объём памяти.
Вход передаётся по значению; сам вызов обычно добавляет временного владельца подсчитываемого значения. Отдельная структура PHP-ссылки, созданной через &, таким выводом не становится надёжно видна. В PHP 8.4 показывается, упакован ли массив (packed). Формат внутренний и не подходит для API/автоматического извлечения бизнес-данных. Для alias элементов массива служит ReflectionReference; для обычной отладки достаточно var_dump.
Рядом: var_dump, get_debug_type. К основам: переменная и присваивание; тип значения.
get_defined_varsПолучить снимок переменных текущей области для ограниченной диагностики.
PHP 4.0.4+ · Core
get_defined_vars(): arrayПолучить снимок переменных текущей области для ограниченной диагностики.
| Часть контракта | Что это означает |
|---|---|
| Параметры | Нет. |
| Возврат | Массив имя → значение в области вызова; состав не фиксирован и не охватывает локальные переменные других вызовов. |
<?php
$outside = "не здесь";
function inspectLine(): void
{
$quantity = 2;
$variables = get_defined_vars();
echo $variables["quantity"], "
";
var_dump(array_key_exists("outside", $variables));
var_dump(array_key_exists("variables", $variables));
}
inspectLine();
Ожидаемый результат
2
bool(false)
bool(false)
Внутренняя quantity уже объявлена; outside не импортирована. Переменная variables ещё не получила результат вызова в момент создания снимка. Это помогает понять область видимости, а не получить все переменные всех функций.
<?php
function debugImport(int $processed): array
{
$phase = "catalog";
$token = "demo-only";
$snapshot = get_defined_vars();
return ["processed" => $snapshot["processed"], "phase" => $snapshot["phase"]];
}
print_r(debugImport(3));
Ожидаемый результат
Array
(
[processed] => 3
[phase] => catalog
)
В снимок попал и token, но наружу выбраны только два поля. В этом небольшом примере лучше сразу вернуть ["processed"=>$processed,"phase"=>$phase]; get_defined_vars показана для исследования и инструментов, а не как обязательная прослойка каждого журнала.
Состав зависит от области вызова и выполненного кода, включая доступные служебные переменные; глобальный dump может раскрыть окружение и секреты. Снимок — PHP-массив, не глубокая независимая копия всех вложенных объектов/ссылок. Не выгружайте его полностью на публичную страницу и не используйте как автоматический вход SQL/шаблона.
Рядом: var_dump, get_debug_type. К основам: переменная и присваивание; тип значения.
get_resource_idПолучить целочисленный идентификатор PHP-ресурса для локального сопоставления.
PHP 8.0+ · Core
get_resource_id(resource $resource): intПолучить целочисленный идентификатор PHP-ресурса для локального сопоставления.
| Часть контракта | Что это означает |
|---|---|
| resource | Дескриптор ресурса, а не имя файла и не число. |
| Возврат | Локальный целочисленный ID; его конкретное значение не фиксируют в тестах. |
<?php
$stream = fopen("php://memory", "r+");
$id = get_resource_id($stream);
var_dump(is_int($id));
var_dump($id === get_resource_id($stream));
fclose($stream);
Ожидаемый результат
bool(true)
bool(true)
Числовая метка зависит от запуска, поэтому пример сравнивает её с меткой того же ресурса, а не обещает конкретное число.
<?php
$first = fopen("php://memory", "r+");
$second = fopen("php://memory", "r+");
try {
$labels = [get_resource_id($first) => "source", get_resource_id($second) => "target"];
echo $labels[get_resource_id($second)], "
";
var_dump(get_resource_id($first) !== get_resource_id($second));
} finally {
fclose($first);
fclose($second);
}
Ожидаемый результат
target
bool(true)
Локальное отображение помогает подписать диагностику импорта. Это не файловый descriptor ОС, ID клиента или устойчивый ключ для БД. После завершения/повторного запуска не ищите ресурс по сохранённому числу.
Неподходящий тип вызывает TypeError. На проверенном PHP 8.5 закрытый ресурс сохраняет доступную числовую метку, но это не делает его пригодным для чтения/записи; проверяйте is_resource. Для объектов нужен другой инструмент, например spl_object_id.
Рядом: get_resource_type, is_resource. К основам: переменная и присваивание; тип значения.
get_resource_typeПолучить техническое имя вида ресурса для диагностики.
PHP 4.0.2+ · Core
get_resource_type(resource $resource): stringПолучить техническое имя вида ресурса для диагностики.
| Часть контракта | Что это означает |
|---|---|
| resource | Ожидается ресурс PHP. |
| Возврат | Имя вроде stream; Unknown для неопознанного/закрытого ресурса в показанном окружении. |
| Неверный тип | TypeError в PHP 8; не передавайте строковое имя файла. |
<?php
$stream = fopen("php://memory", "r+");
echo get_resource_type($stream);
fclose($stream);
Ожидаемый результат
streamОтвет говорит, что это поток PHP. Он не сообщает, находится ли поток в памяти, файле или сети; подробности потока получают отдельными API.
<?php
$stream = fopen("php://memory", "r+");
fclose($stream);
echo get_resource_type($stream), "
";
try {
get_resource_type("php://memory");
} catch (TypeError $error) {
echo "Нужен ресурс, а не строка";
}
Ожидаемый результат
Unknown
Нужен ресурс, а не строкаВ PHP 8.5.11 закрытый поток даёт Unknown, строка — TypeError. В старых описаниях можно встретить null с предупреждением для не-ресурса; современный обработчик не должен рассчитывать на такой возврат. Проверка выполнена на целевой версии.
Рядом: get_resource_id, is_resource, get_debug_type. К основам: переменная и присваивание; тип значения.
serializeПредставить собственные PHP-данные строкой для контролируемого хранения.
PHP 4+ · standard
serialize(mixed $value): stringКак использовать результат. Serialize получает собственную структуру и возвращает строку снимка. Дальнейшая запись этой строки — отдельная операция; функция сама файл не создаёт. Строка хранит данные и типы, но не обеспечивает доверие, шифрование или подпись.
Представить собственные PHP-данные строкой для контролируемого хранения.
| Часть контракта | Что это означает |
|---|---|
| value | Значение для снимка; ресурсы и некоторые объекты не поддерживаются. |
| Возврат | Бинарно-безопасная строка с типами и структурой; сама по себе не шифрует и не подписывает данные. |
| Ошибки | Возможны исключения неподдерживаемых объектов и пользовательских __serialize/__sleep. |
<?php
$line = ["qty" => 2];
$stored = serialize($line);
var_dump(is_string($stored));
echo $stored;
Ожидаемый результат
bool(true)
a:1:{s:3:"qty";i:2;}a обозначает массив, s — строку, i — целое. Числа длины строк относятся к байтам. Это знакомство с представлением: собирать или чинить его вручную заменой строк не нужно.
Следующий пример сохраняет только собственный небольшой массив во временный файл. Реальная задача — пережить границу запуска PHP, когда значение уже нельзя держать в оперативной переменной. tempnam создаёт новый файл, try/finally обеспечивает удаление именно этого учебного файла. Для постоянного кеша нужны отдельные правила путей, прав, атомарной записи и истечения срока.
<?php
$cart = ['version' => 1, 'items' => [['sku' => 'TEA', 'qty' => 2]]];
$encoded = serialize($cart);
$file = tempnam(sys_get_temp_dir(), 'phpman-cart-');
if ($file === false) {
throw new RuntimeException('Не удалось создать учебный файл');
}
try {
if (file_put_contents($file, $encoded, LOCK_EX) !== strlen($encoded)) {
throw new RuntimeException('Неполная запись');
}
$bytes = file_get_contents($file);
if ($bytes === false) {
throw new RuntimeException('Не удалось прочитать файл');
}
$restored = unserialize($bytes, ['allowed_classes' => false, 'max_depth' => 8]);
if (!is_array($restored) || ($restored['version'] ?? null) !== 1) {
throw new UnexpectedValueException('Неизвестный формат кеша');
}
echo $restored['items'][0]['sku'], ':', $restored['items'][0]['qty'];
} finally {
unlink($file);
}
Ожидаемый результат
TEA:2Источник полностью создан этим примером. allowed_classes=false ограничивает восстановление обычных классов, но не делает чужие данные безопасными. Версия снимка помогает отличить старый формат. В рабочем кеше проверяют и всю схему items, а блокировка записи сама не решает гонки чтения и устаревание данных.
<?php
class CartSnapshot
{
public function __construct(public int $quantity) {}
public function __serialize(): array
{
return ['quantity' => $this->quantity];
}
public function __unserialize(array $data): void
{
if (!is_int($data['quantity'] ?? null) || $data['quantity'] < 0) {
throw new UnexpectedValueException('Некорректное количество');
}
$this->quantity = $data['quantity'];
}
}
$snapshot = new CartSnapshot(2);
$stored = serialize($snapshot);
$restored = unserialize($stored, ['allowed_classes' => [CartSnapshot::class]]);
echo $restored->quantity;
Ожидаемый результат
2Это ступень после классов/конструктора. __serialize задаёт переносимое состояние, __unserialize проверяет его при восстановлении; обычный конструктор для такого восстановления не вызывается. Тип и инварианты нельзя считать автоматически выполненными только потому, что когда-то вызывали new.
Восстанавливать объекты можно только при доступных совместимых определениях классов. Сначала используется __serialize, иначе возможен __sleep; при восстановлении — __unserialize, иначе __wakeup. Методы могут выбрасывать исключения и иметь побочные действия. Подробнее: магические методы.
<?php
$callback = static fn (): int => 2;
try {
serialize($callback);
} catch (Exception $error) {
echo "Closure нельзя сохранить этим способом";
}
Ожидаемый результат
Closure нельзя сохранить этим способомАнонимная функция — исполняемое поведение с контекстом, а не простой снимок данных. Сохраните имя разрешённой операции и её данные, затем восстановите действие через явное отображение. Не пытайтесь сериализовать соединение с БД или ресурс потока.
Результат — бинарная PHP-строка, которая может содержать нулевые байты; при хранении выбирайте бинарно-безопасный канал, например BLOB, без перекодирования или ручного обрезания. serialize сохраняет внутренние ссылки/циклы структуры, но не внешние связи с переменными вне снимка. Большая структура требует обхода и дополнительной памяти. Для Telegram, Python или Node.js обычно нужен JSON, поскольку PHP-формат не является общим протоколом.
Рядом: unserialize, var_export, print_r. К основам: переменная и присваивание; тип значения.
unserializeВосстановить значение из доверенного PHP-снимка и обработать ошибки формата.
PHP 4+ · standard
unserialize(string $data, array $options = []): mixedКак использовать результат. Восстановление получает строку собственного снимка и параметры allowed_classes/max_depth. Возвращённое значение сначала проверяют по ожидаемой схеме, затем используют. False может быть как корректными сохранёнными данными, так и отказом формата с диагностикой.
Восстановить значение из доверенного PHP-снимка и обработать ошибки формата.
| Часть контракта | Что это означает |
|---|---|
| data | Строка PHP-сериализации из контролируемого источника. |
| allowed_classes | true (по умолчанию), false либо список разрешённых имён классов. Не является достаточной защитой для чужого входа. |
| max_depth | int >= 0: предел вложенности одного вызова, 0 отключает предел. По умолчанию unserialize_max_depth, обычно 4096. Неверный тип даёт TypeError, отрицательное целое — ValueError. |
| Возврат / ошибка | Восстановленное значение любого поддерживаемого типа; при повреждении false и диагностика. Методы объектов могут бросать исключения. |
<?php
$original = ["qty" => 2];
$bytes = serialize($original);
$restored = unserialize($bytes, ["allowed_classes" => false]);
echo $restored["qty"];
Ожидаемый результат
2serialize создала строку, unserialize восстановила значение. Эти действия не означают отправку по сети: каналы хранения и доверие к ним — отдельная часть приложения.
false неоднозначен: это и допустимое восстановленное значение, и результат ошибки разбора. Предупреждение нужно учитывать отдельно. Следующий пример использует временный обработчик, превращающий диагностическое сообщение в ErrorException, и обязательно возвращает прежний обработчик. Это стадия после главы обработки ошибок.
<?php
set_error_handler(static function (int $level, string $message): never {
throw new ErrorException($message, 0, $level);
});
try {
foreach ([serialize(false), 'broken'] as $bytes) {
try {
$value = unserialize($bytes, ['allowed_classes' => false, 'max_depth' => 8]);
echo 'Прочитано: ', get_debug_type($value), "\n";
} catch (ErrorException $error) {
echo "Повреждённый снимок\n";
}
}
} finally {
restore_error_handler();
}
Ожидаемый результат
Прочитано: bool
Повреждённый снимок
never у callback означает, что он не возвращается обычным образом, а бросает исключение. Не выводим исходную диагностику посетителю: она может содержать детали хранения. Для реального обработчика определите область перехвата и правила журналирования; не подавляйте сообщение оператором @.
<?php
$bytes = serialize(['outer' => ['inner' => ['qty' => 2]]]);
set_error_handler(static function (int $level, string $message): never {
throw new ErrorException($message, 0, $level);
});
try {
try {
unserialize($bytes, ['allowed_classes' => false, 'max_depth' => 1]);
} catch (ErrorException $error) {
echo "Глубина больше разрешённой\n";
}
$data = unserialize($bytes, ['allowed_classes' => false, 'max_depth' => 8]);
echo $data['outer']['inner']['qty'];
} finally {
restore_error_handler();
}
Ожидаемый результат
Глубина больше разрешённой
2Лимит 1 намеренно мал для нашего собственного вложенного снимка. Число 8 соответствует маленькому договору примера, а не универсальной рекомендации. Ограничение глубины не ограничивает число соседних элементов; отдельно ограничивайте размер доверенного файла.
<?php
class DeliverySnapshot
{
public int $places = 2;
}
$bytes = serialize(new DeliverySnapshot());
$value = unserialize($bytes, ["allowed_classes" => false]);
echo get_debug_type($value), "
";
var_dump(is_object($value));
Ожидаемый результат
__PHP_Incomplete_Class
bool(true)
Получен объект, но не полноценный DeliverySnapshot. is_object сам не доказывает готовность к вызову методов. allowed_classes не распространяется на перечисления enum; это ограничение конкретного механизма, не универсальная песочница.
<?php
$bytes = serialize(['qty' => 2]);
foreach (['8', -1] as $depth) {
try {
unserialize($bytes, ['allowed_classes' => false, 'max_depth' => $depth]);
} catch (TypeError | ValueError $error) {
echo get_class($error), "\n";
}
}
Ожидаемый результат
TypeError
ValueError
max_depth принимает int от 0, а не числовую строку: "8" здесь не приводится автоматически. Отрицательное целое даёт ValueError. Сам снимок корректен; исправить нужно параметры вызова. Вертикальная черта в catch позволяет обработать два типа исключений.
| Версия / случай | Что учитывать |
|---|---|
| PHP 7.4+ | options[max_depth] и unserialize_max_depth; 0 отключает ограничение. |
| PHP 8.3+ | Неразбираемый вход вызывает E_WARNING; раньше E_NOTICE. Лишние данные после одного значения также вызывают E_WARNING, даже если значение уже прочитано. |
| PHP 8.4+ | Неверные allowed_classes вызывают TypeError/ValueError; старые строки с тегом S deprecated, нормальный serialize использует подходящий формат. |
| Класса нет | Возможна автозагрузка/настроенный unserialize_callback_func; иначе __PHP_Incomplete_Class. Методы восстановления могут выбросить Throwable. |
| Правильный разбор | После восстановления всё равно проверяют тип, версию снимка и схему. Семантическая корректность не следует из отсутствия предупреждения. |
Если собственный снимок хранится в месте, где его могли изменить, сначала проверяйте происхождение и целостность по своему протоколу; простое наличие allowed_classes не устанавливает доверие. Не читайте сериализованные cookies пользователя. Даже локальный кеш требует контроля прав и жизненного цикла. При больших структурах разбор потребляет память и время; измеряйте полный сценарий хранения.
Рядом: serialize, is_array, is_object, get_debug_type. К основам: переменная и присваивание; тип значения.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


