Extract: примеры (PHP)
extract(array $array, int $flags = EXTR_OVERWRITE, string $prefix = ""): intФункция 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; // большойсинийбольшой
$color = 'красный';
$data = ['color' => 'зеленый', 'type' => 'дерево'];
extract($data, EXTR_PREFIX_SAME, 'prefix');
echo $color; // красный
echo $prefix_color; // зеленыйкрасныйзеленый
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 8.0 появился флаг EXTR_PREFIX_IF_EXISTS, который добавляет префикс только если существует неупрефиксная версия переменной. В PHP 7.3 было добавлено предупреждение при передаче неверного типа в аргумент flags. В PHP 5.4 флаг EXTR_REFS стал доступен для всех типов массивов, а не только для ассоциативных.
$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']; // localhostlocalhostlocalhost
$existingVar = 'старое';
$newVar = 'новое';
$array = ['existingVar' => 'обновленное', 'newVar' => 'созданное'];
extract($array, EXTR_IF_EXISTS);
echo $existingVar; // обновленное
echo isset($newVar) ? $newVar : 'не создана'; // не созданаобновленноене создана
$original = 'начало';
$array = ['refVar' => 'изменено'];
extract($array, EXTR_REFS);
$refVar = 'конец';
echo $array['refVar']; // изменение отражается в массивеконец
$color = 'красный';
$shape = 'круг';
$data = ['color' => 'синий', 'size' => 'большой', '1test' => 'некорректное'];
extract($data, EXTR_PREFIX_SAME | EXTR_PREFIX_INVALID, 'pref');
echo $color; // красный
echo $pref_color; // синий
echo $pref_1test; // некорректноекрасныйсинийнекорректное
data = {'color': 'синий', 'size': 'большой'}
color, size = data['color'], data['size'] # Явное присваивание
# Или через locals().update(data) - но это не рекомендуется# Переменные color и size созданы
const data = {color: 'синий', size: 'большой'};
const {color, size} = data;
console.log(color); // синийсиний
В SQL переменные устанавливаются явно через SET @var = value. Нет возможности массового импорта из результирующего набора.
Основное отличие PHP extract - автоматическое создание переменных без явного перечисления. В других языках предпочитают явную деструктуризацию или избегают динамического создания переменных.