Функция compact() в PHP
Узнайте, как функция compact() в PHP создаёт ассоциативный array из переменных: синтаксис, примеры и типичные ошибки.
Что такое функция compact() в PHP?
compact() — это встроенная функция PHP, которая создаёт ассоциативный array из существующих переменных. Вы передаёте ей имена переменных (в виде строк), а она возвращает array, где ключами являются эти имена, а значениями — текущие значения переменных. Она является обратной функцией extract(), которая преобразует array обратно в отдельные переменные.
На этой странице рассматриваются синтаксис, принцип разрешения имён переменных функцией compact(), передача имён в виде array, поведение при значении null и отсутствующих переменных, а также типичный практический сценарий использования.
Синтаксис
compact(string|array ...$var_names): arrayКаждый аргумент — это либо string с именем переменной, либо array таких строк. compact() возвращает результирующий ассоциативный array.
Как это работает?
compact() ищет переменные в текущей области видимости по каждому переданному имени. Если переменная с таким именем существует, она добавляется в результат (имя становится ключом, значение переменной — значением) — даже если значение равно null. Если переменной с таким именем не существует, это имя пропускается, а PHP 8.0+ выдаёт предупреждение («Undefined variable»).
Вот простейший пример:
Базовый пример compact()
Мы создаём три переменные и передаём их имена в compact(). Результирующий array выглядит так:
Array (
[name] => John
[age] => 30
[city] => New York
)Обратите внимание: имена передаются без ведущего знака $ — "name", а не $name.
Зачем использовать compact()?
- Меньше повторений: Вместо того чтобы писать
['name' => $name, 'age' => $age, 'city' => $city], вы пишетеcompact('name', 'age', 'city'). Ключ и имя переменной автоматически остаются синхронизированными. - Читаемость: Когда ключ array и переменная уже имеют одинаковое имя,
compact()избавляет от визуального шума дублирования каждой пары. - Меньше опечаток: При ручном написании пар ключ-значение легко ошибиться в ключе. С
compact()ключ выводится из имени переменной.
Примеры
Переменная со значением null
Здесь $state определена, но содержит null. Поскольку переменная существует, она всё равно включается — её значение в array равно null (что print_r отображает как пустое значение):
Array (
[name] => John
[age] => 30
[city] => New York
[state] =>
)Имя, для которого нет соответствующей переменной в области видимости, — другой случай: оно полностью пропускается (и PHP 8.0+ выдаёт предупреждение). Таким образом, compact('name', 'missing') вернёт только ['name' => 'John'].
Передача имён в виде array
Любой аргумент может сам быть array имён, который compact() разворачивает. Это удобно, когда список полей формируется динамически:
<?php
$name = "John";
$age = 30;
$city = "New York";
$fields = ["name", "age"];
$myArray = compact("city", $fields);
print_r($myArray);
?>Array (
[city] => New York
[name] => John
[age] => 30
)Практический пример: передача данных в шаблон
compact() отлично подходит, когда нужно передать представлению или шаблону набор именованных значений, не создавая array вручную:
<?php
function renderProfile() {
$username = "jdoe";
$role = "admin";
$isActive = true;
// Pass all three as a tidy associative array
return compact("username", "role", "isActive");
}
print_r(renderProfile());
?>Array (
[username] => jdoe
[role] => admin
[isActive] => 1
)Советы и подводные камни
- Передавайте имена переменных без знака
$:compact("name"), а неcompact($name). compact()читает только текущую область видимости — внутри функции она видит локальные переменные этой функции, а не глобальные.- Она включает переменные со значением
null, но пропускает имена, для которых нет соответствующей переменной (в PHP 8.0+ это вызывает предупреждение). Используйтеisset()или заранее определите переменную, если она должна присутствовать. - Для обратного преобразования — превращения array в переменные — используйте
extract(). Чтобы узнать, какие переменные существуют в текущей области видимости, см.get_defined_vars().
Связанные функции
extract()— обратная функция дляcompact(): импортирует ключи array как переменные.get_defined_vars()— возвращает все переменные, определённые в текущей области видимости.- Ассоциативные массивы — тип array, который создаёт
compact().