Эта функция используется для импорта переменных из массива в текущую символьную таблицу.
Она берёт ассоциативный массив в качестве параметра
var_array
и трактует его ключи как имена переменных
и значения как значения переменных. Для каждой пары ключ/значение будет
создана переменная в текущей символьной таблице, согласно параметрам
extract_type
и
prefix
.
Замечание:
Начиная с версии 4.0.5, эта функция возвращает количество
извлечённых переменных.
Замечание:
EXTR_IF_EXISTS и EXTR_PREFIX_IF_EXISTS были добавлены в версии 4.2.0.
Замечание:
EXTR_REFS был добавлен в версии 4.3.0.
extract() проверяет каждый ключ на соответствие
приемлемости в качестве имени переменной. Эта функция также обрабатывает
коллизии имён, если ключ совпадает с именем переменной, уже существующей
в текущей символьной таблице. Способ обработки неприемлемых/числовых
ключей и коллизий имён устанавливает параметр
extract_type
. Он может принимать одно из следующих
значений:
EXTR_OVERWRITE
Если переменная с таким именем существует, она будет переназначена.
EXTR_SKIP
Если переменная с таким именем существует, будет сохранено её прежнее значение.
EXTR_PREFIX_SAME
Если переменная с таким именем существует, к её имени будет добавлен
префикс, определённый параметром prefix
.
EXTR_PREFIX_ALL
Добавить префикс prefix
ко всем именам переменных.
Начиная с PHP 4.0.5, также включает числовые имена.
EXTR_PREFIX_INVALID
Добавить префикс prefix
только к неприемлемым/числовым
именам переменных. Этот флаг был добавлен в PHP 4.0.5.
EXTR_IF_EXISTS
Переназначить только переменные, уже имеющиеся в текущей символьной таблице,
в противном случае ничего не делать. Данная возможность полезна
для определения списка приемлемых переменных и для извлечения только
тех переменных, которые вы уже определили из массивов типа $_REQUEST, например.
Этот флаг был добавлен в PHP 4.2.0.
EXTR_PREFIX_IF_EXISTS
Создать переменные, имена которых начинаются с prefix
только если переменная с названием, которому не предшествует prefix
,
определена в текущей символьной таблице.
Этот флаг был добавлен в PHP 4.2.0.
EXTR_REFS
Извлечь переменные как ссылки. Это означает, что значения таких переменных
будут всё ещё ссылаться на значения массива var_array
.
Вы можете использовать этот флаг
отдельно или комбинировать его с другими, используя OR. Этот флаг был добавлен в PHP 4.3.0.
Если extract_type
не определён, он
трактуется как EXTR_OVERWRITE.
Обратите внимание, что prefix
имеет значение, только если
extract_type
установлен в EXTR_PREFIX_SAME,
EXTR_PREFIX_ALL, EXTR_PREFIX_INVALID
или EXTR_PREFIX_IF_EXISTS. Если
в результате добавления префикса, не будет получено допустимое имя для переменной,
она не будет импортирована в текущую символьную таблицу.
extract() возвращает количество переменных,
успешно импортированных в символьную таблицу.
Внимание
Не используйте функцию extract() для непроверенных данных, таких как
пользовательский ввод ($_GET, ...). Если вы сделаете это, например,
для того, что бы временно запустить старый код, использующий
register_globals,
используйте соответствующий флаг extract_type
для того, что бы не переназначить уже установленные переменные,
такой как EXTR_SKIP и удостоверьтесь, что вы извлекаете
содержимое массивов
$_SERVER, $_SESSION,
$_COOKIE, $_POST и
$_GET в этом порядке.
Функцию extract() также можно использовать для импорта
в текущую символьную таблицу переменных, содержащихся в ассоциативном массиве,
возвращённом функцией wddx_deserialize().
Пример #1 Пример использования extract()
<?php
/* Предположим, что $var_array - это массив, полученный в результате wddx_deserialize */
Переменная $size не была переназначена, потому что мы
определили EXTR_PREFIX_SAME, в результате чего была создана
переменная $wddx_size. Если был бы определён флаг EXTR_SKIP,
тогда переменная $wddx_size не была бы создана.
EXTR_OVERWRITE был бы причиной того, что переменной $size
было бы присвоено значение "medium", и EXTR_PREFIX_ALL был бы причиной того, что были бы также
созданы новые переменные $wddx_color,
$wddx_size и
$wddx_shape.
Вы должны использовать ассоциативный массив, использование числовых массивов
не приведёт ни к каким результатам, если вы не использууете EXTR_PREFIX_ALL и
EXTR_PREFIX_INVALID.