1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-27 01:02:19 +01:00
Files
archived-doc-ru/reference/array/functions/extract.xml
Sergey Panteleev 3586b1d1f2 docs(ru): Updated to English revision
git-svn-id: https://svn.php.net/repository/phpdoc/ru/trunk@351864 c90b9560-bf6c-de11-be94-00142212c4b1
2020-12-04 06:44:55 +00:00

360 lines
15 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: cd943f94a013b74df8765ab8e1a620a916a64a85 Maintainer: shein Status: ready -->
<!-- Reviewed: yes -->
<!-- $Revision$ -->
<refentry xml:id="function.extract" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>extract</refname>
<refpurpose>Импортирует переменные из массива в текущую таблицу символов</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>int</type><methodname>extract</methodname>
<methodparam><type>array</type><parameter role="reference">array</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>flags</parameter><initializer><constant>EXTR_OVERWRITE</constant></initializer></methodparam>
<methodparam choice="opt"><type>string</type><parameter>prefix</parameter><initializer>""</initializer></methodparam>
</methodsynopsis>
<para>
Импортирует переменные из массива в текущую таблицу символов.
</para>
<para>
Каждый ключ проверяется на предмет корректного имени переменной.
Также проверяются совпадения с существующими переменными в
символьной таблице.
</para>
<warning>
<para>
Не используйте <function>extract</function> на непроверенных данных, таких как пользовательский ввод
(например, <varname>$_GET</varname>, <varname>$_FILES</varname>).
</para>
</warning>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>array</parameter></term>
<listitem>
<para>
Ассоциативный массив. Эта функция рассматривает ключи массива
в качестве имен переменных, а их значения - в качестве значений
этих переменных. Для каждой пары ключ/значение будет создана
переменная в текущей таблице символов, в соответствии с
параметрами <parameter>flags</parameter> и
<parameter>prefix</parameter>.
</para>
<para>
Вы должны использовать ассоциативный массив, использование
числовых массивов не приведёт ни к каким результатам,
если вы не используете <constant>EXTR_PREFIX_ALL</constant>
или <constant>EXTR_PREFIX_INVALID</constant>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>flags</parameter></term>
<listitem>
<para>
Параметр <parameter>flags</parameter> определяет способ
трактования неправильных/числовых ключей и коллизий. Он может
принимать следующие значения:
<variablelist>
<varlistentry>
<term><constant>EXTR_OVERWRITE</constant></term>
<listitem>
<simpara>
Если переменная с таким именем существует, она будет перезаписана.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>EXTR_SKIP</constant></term>
<listitem>
<simpara>
Если переменная с таким именем существует, ее текущее значение
не будет перезаписано.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>EXTR_PREFIX_SAME</constant></term>
<listitem>
<simpara>Если переменная с таким именем существует, к её имени
будет добавлен префикс, определённый параметром
<parameter>prefix</parameter>.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>EXTR_PREFIX_ALL</constant></term>
<listitem>
<simpara>
Добавить префикс <parameter>prefix</parameter> ко всем именам переменных.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>EXTR_PREFIX_INVALID</constant></term>
<listitem>
<simpara>
Добавить префикс <parameter>prefix</parameter> только к
некорректным/числовым именам переменных.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>EXTR_IF_EXISTS</constant></term>
<listitem>
<simpara>
Перезаписать только переменные, уже имеющиеся в текущей
таблице символов, в противном случае не делать ничего.
Данная возможность полезна для определения списка
приемлемых переменных и для извлечения только тех
переменных, которые вы уже определили из массивов
типа <varname>$_REQUEST</varname>, например.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>EXTR_PREFIX_IF_EXISTS</constant></term>
<listitem>
<simpara>
Создать только префикс-версии переменных, если версия
данной переменной без префикса уже существует в текущей символьной таблице.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>EXTR_REFS</constant></term>
<listitem>
<simpara>
Извлечь переменные как ссылки. Это означает, что
значения таких переменных будут всё ещё ссылаться на
значения массива <parameter>array</parameter>.
Вы можете использовать этот флаг отдельно или
комбинировать его с другими значениями
<parameter>flags</parameter> с помощью побитового 'или'.
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
Если <parameter>flags</parameter> не указан, он
трактуется как <constant>EXTR_OVERWRITE</constant>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>prefix</parameter></term>
<listitem>
<para>
Обратите внимание, что <parameter>prefix</parameter> имеет
значение, только если <parameter>flags</parameter>
установлен в <constant>EXTR_PREFIX_SAME</constant>,
<constant>EXTR_PREFIX_ALL</constant>,
<constant>EXTR_PREFIX_INVALID</constant>
или <constant>EXTR_PREFIX_IF_EXISTS</constant>. Если
в результате добавления префикса, не будет получено
допустимое имя для переменной, она не будет импортирована
в текущую символьную таблицу.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Возвращает количество переменных, успешно импортированных в
текущую таблицу символов.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Пример использования <function>extract</function></title>
<para>
Функцию <function>extract</function> также можно использовать
для импорта в текущую таблицу символов переменных,
содержащиеся в ассоциативном массиве, возвращаемом функцией
<function>wddx_deserialize</function>.
</para>
<programlisting role="php">
<![CDATA[
<?php
/* Предположим, что $var_array - это массив, полученный в результате
wddx_deserialize */
$size = "large";
$var_array = array("color" => "blue",
"size" => "medium",
"shape" => "sphere");
extract($var_array, EXTR_PREFIX_SAME, "wddx");
echo "$color, $size, $shape, $wddx_size\n";
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
blue, large, sphere, medium
]]>
</screen>
<para>
Переменная <varname>$size</varname> не была перезаписана,
потому что мы определили <constant>EXTR_PREFIX_SAME</constant>,
в результате чего была создана переменная <varname>$wddx_size</varname>.
Если был бы определён флаг <constant>EXTR_SKIP</constant>,
тогда переменная <varname>$wddx_size</varname> не была бы создана.
<constant>EXTR_OVERWRITE</constant> была бы причиной того,
что переменной <varname>$size</varname> было бы присвоено
значение "medium", и <constant>EXTR_PREFIX_ALL</constant>
была бы причиной того, что были бы также созданы новые
переменные <varname>$wddx_color</varname>,
<varname>$wddx_size</varname> и <varname>$wddx_shape</varname>.
</para>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<warning>
<para>
Не используйте функцию <function>extract</function> на
непроверенных данных, таких как пользовательский ввод
(<varname>$_GET</varname>, <varname>$_FILES</varname> и т.п.).
Если вы сделаете это, например, чтобы временно
запустить старый код, использующий
<link linkend="security.globals">register_globals</link>,
убедитесь, что используете один из флагов <parameter>flags</parameter>,
не перезаписывающие переменные, такой как
<constant>EXTR_SKIP</constant> и имейте в виду,
что вы должны извлекать их в том порядке, который определен в
директиве <link linkend="ini.variables-order">variables_order</link>
внутри <link linkend="ini">&php.ini;</link>.
</para>
</warning>
<note>
<para>
Если у вас все еще включена директива
<link linkend="security.globals">register_globals</link>
и вы используете <function>extract</function> с массивом
<varname>$_FILES</varname> и флагом
<constant>EXTR_SKIP</constant>, результат может вас удивить.
</para>
<warning>
<para>
Это нерекомендуемая практика и документирована здесь только
для полноты картины. Использование
<link linkend="security.globals">register_globals</link> считается
устаревшим и вызов <function>extract</function> на непроверенных
данных, таких как <varname>$_FILES</varname>, как уже было сказано
выше, потенциальный риск безопасности. Если вы столкнулись с
данным случаем, это означает что вы используете как минимум
две плохие практики кодирования.
</para>
</warning>
<programlisting role="php">
<![CDATA[
<?php
/* Предположим, что $testfile это имя поля для загрузки файла
и что директива register_globals включена. */
var_dump($testfile);
extract($_FILES, EXTR_SKIP);
var_dump($testfile);
var_dump($testfile['tmp_name']);
?>
]]>
</programlisting>
<simpara>
Вы можете ожидать что-нибудь вроде следующего:
</simpara>
<screen>
<![CDATA[
string(14) "/tmp/phpgCCPX8"
array(5) {
["name"]=>
string(10) "somefile.txt"
["type"]=>
string(24) "application/octet-stream"
["tmp_name"]=>
string(14) "/tmp/phpgCCPX8"
["error"]=>
int(0)
["size"]=>
int(4208)
}
string(14) "/tmp/phpgCCPX8"
]]>
</screen>
<simpara>
Однако, вместо этого вы увидите что-нибудь вроде этого:
</simpara>
<screen>
<![CDATA[
string(14) "/tmp/phpgCCPX8"
string(14) "/tmp/phpgCCPX8"
string(1) "/"
]]>
</screen>
<para>
Это происходит потому, что так как включена директива
<link linkend="security.globals">register_globals</link>,
переменная <varname>$testfile</varname> уже существует
в глобальной области видимости в момент вызова
<function>extract</function>. А так как указан параметр
<constant>EXTR_SKIP</constant>, <varname>$testfile</varname>
не будет перезаписана содержимым массива
<constant>$_FILES</constant>, поэтому
<varname>$testfile</varname> останется строкой.
Так как <link linkend="language.types.string.substr">к строкам
можно обращаться с помощью синтаксиса массивов</link>
и нечисловая строка <literal>tmp_name</literal> интерпретируется
как <literal>0</literal>, PHP воспринимает
<varname>$testfile['tmp_name']</varname> как
<varname>$testfile[0]</varname>.
</para>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>compact</function></member>
<member><function>list</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->