Extract: примеры (PHP)

Руководство по применению функции extract в языке PHP
Раздел: Работа с переменными
extract(array $array, int $flags = EXTR_OVERWRITE, string $prefix = ""): int
Функция extract в PHP

Функция extract импортирует переменные из ассоциативного массива в текущую таблицу символов. Она преобразует ключи массива в имена переменных, а значения становятся их содержимым.

Основные случаи применения

Использование extract упрощает работу с данными, полученными из форм, баз данных или конфигурационных файлов. Функция находит применение в шаблонизаторах и скриптах быстрого прототипирования.

Аргументы функции
  • array - обязательный ассоциативный массив.
  • flags - необязательный параметр, определяющий обработку конфликтующих имен.
    • EXTR_OVERWRITE - перезаписывает существующие переменные (значение по умолчанию).
    • EXTR_SKIP - пропускает элементы при совпадении имен.
    • EXTR_PREFIX_SAME - добавляет префикс при конфликте имен.
    • EXTR_PREFIX_ALL - добавляет префикс ко всем именам переменных.
    • EXTR_PREFIX_INVALID - добавляет префикс только к некорректным именам переменных.
    • EXTR_IF_EXISTS - извлекает только уже существующие переменные.
    • EXTR_PREFIX_IF_EXISTS - добавляет префикс только если существует неупрефиксная версия.
    • EXTR_REFS - извлекает переменные как ссылки.
  • prefix - строка префикса, используемая с флагами EXTR_PREFIX_*.
Примеры использования
Базовое извлечение
$data = ['color' => 'синий', 'size' => 'большой'];
extract($data);
echo $color; // синий
echo $size; // большой
синийбольшой
Использование EXTR_PREFIX_SAME
$color = 'красный';
$data = ['color' => 'зеленый', 'type' => 'дерево'];
extract($data, EXTR_PREFIX_SAME, 'prefix');
echo $color; // красный
echo $prefix_color; // зеленый
красныйзеленый
Похожие функции в PHP

compact - создает массив из переменных и их значений, выполняет обратную операцию по сравнению с extract.

list - присваивает переменным значения из массива по порядку, работает только с индексированными массивами.

Переменные переменных - конструкция $$var позволяет динамически создавать переменные, но требует ручной обработки.

Функция extract предпочтительна при импорте множества переменных из ассоциативного массива. Compact применяется для экспорта переменных в массив. List эффективен для деструктуризации индексированных массивов.

Типичные ошибки
Конфликт имен без указания флага
$user = 'администратор';
$data = ['user' => 'гость'];
extract($data); // По умолчанию EXTR_OVERWRITE
echo $user; // Переменная перезаписана
гость
Использование ненадежных данных
// Опасный пример с пользовательским вводом
$_GET['config'] = 'значение';
extract($_GET); // Создает переменную $config
// Может перезаписать важные системные переменные
# Без видимого вывода, но создана переменная $config
Некорректные имена переменных
$data = ['123number' => 'тест'];
extract($data, EXTR_PREFIX_INVALID, 'p');
echo $p_123number; // Префикс добавлен
тест
Изменения в новых версиях PHP

В PHP 8.0 появился флаг EXTR_PREFIX_IF_EXISTS, который добавляет префикс только если существует неупрефиксная версия переменной. В PHP 7.3 было добавлено предупреждение при передаче неверного типа в аргумент flags. В PHP 5.4 флаг EXTR_REFS стал доступен для всех типов массивов, а не только для ассоциативных.

Расширенные примеры
Работа с вложенными массивами
Пример php
$config = [
    'database' => ['host' => 'localhost', 'name' => 'test'],
    'settings' => ['debug' => true]
];

// Извлечение только первого уровня
еxtract($config);
echo $database['host']; // localhost

// Извлечение с префиксом для всех элементов
extract($config, EXTR_PREFIX_ALL, 'conf');
echo $conf_database['host']; // localhost
localhostlocalhost
Использование EXTR_IF_EXISTS
Пример php
$existingVar = 'старое';
$newVar = 'новое';
$array = ['existingVar' => 'обновленное', 'newVar' => 'созданное'];

extract($array, EXTR_IF_EXISTS);
echo $existingVar; // обновленное
echo isset($newVar) ? $newVar : 'не создана'; // не создана
обновленноене создана
Извлечение переменных как ссылок
Пример php
$original = 'начало';
$array = ['refVar' => 'изменено'];
extract($array, EXTR_REFS);
$refVar = 'конец';
echo $array['refVar']; // изменение отражается в массиве
конец
Комбинация флагов
Пример php
$color = 'красный';
$shape = 'круг';
$data = ['color' => 'синий', 'size' => 'большой', '1test' => 'некорректное'];

extract($data, EXTR_PREFIX_SAME | EXTR_PREFIX_INVALID, 'pref');
echo $color; // красный
echo $pref_color; // синий
echo $pref_1test; // некорректное
красныйсинийнекорректное
Аналоги в других языках
Python: распаковка словаря
data = {'color': 'синий', 'size': 'большой'}
color, size = data['color'], data['size']  # Явное присваивание
# Или через locals().update(data) - но это не рекомендуется
# Переменные color и size созданы
JavaScript: деструктуризация объекта
const data = {color: 'синий', size: 'большой'};
const {color, size} = data;
console.log(color); // синий
синий
MySQL: нет прямой аналогии

В SQL переменные устанавливаются явно через SET @var = value. Нет возможности массового импорта из результирующего набора.

Основное отличие PHP extract - автоматическое создание переменных без явного перечисления. В других языках предпочитают явную деструктуризацию или избегают динамического создания переменных.

PHP extract function comments

En
Extract Import variables into the current symbol table from an array