1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-25 16:22:18 +01:00
Files
archived-doc-ru/reference/misc/functions/eval.xml
2024-06-15 12:16:22 +03:00

170 lines
7.1 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: 78d17c25eeecc78cb7098b1a01d42391e36af2c1 Maintainer: aur Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.eval" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>eval</refname>
<refpurpose>Вычисляет строку как PHP-код</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>mixed</type><methodname>eval</methodname>
<methodparam><type>string</type><parameter>code</parameter></methodparam>
</methodsynopsis>
<para>
Функция вычисляет параметр <parameter>code</parameter> как PHP-код.
</para>
<para>
Код, который вычисляет функция, наследует
<link linkend="language.variables.scope">область видимости переменных</link> той строки,
на которой вызвали языковую конструкцию <function>eval</function>.
Каждая переменная, доступная на этой строке, будет доступна для чтения
и изменения в коде, который вычисляет языковая конструкция.
При этом функции и классы, которые объявят в выполняемом коде, получат глобальную область видимости.
Говоря по-другому, компилятор вычислит код так, как если бы это был отдельный
<link linkend="function.include">подключённый</link> файл.
</para>
<caution>
<para>
Языковая конструкция <function>eval</function> <emphasis>очень
опасна</emphasis>, поскольку разрешает выполнять произвольный PHP-код.
<emphasis>Поэтому не рекомендуется пользоваться этой языковой конструкцией</emphasis>.
Если тщательная проверка показала, что нет другого выхода,
кроме как использовать эту конструкцию, внимательно проверяют, чтобы в языковую конструкцию
<emphasis>не передавались пользовательские данные</emphasis> без правильной предварительной проверки.
</para>
</caution>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>code</parameter></term>
<listitem>
<para>
Корректный PHP-код для оценки и выполнения.
</para>
<para>
Код нельзя оборачивать открывающим и закрывающим
<link linkend="language.basic-syntax.phpmode">PHP-тегами</link>, то есть
необходимо передать <literal>'echo "Привет!";'</literal>,
а не <literal>'&lt;?php echo "Привет!"; &gt;'</literal>.
По-прежнему разрешается переключаться между режимами PHP- и HTML-кода, например:
<literal>'echo "Код PHP!"; ?&gt;Код HTML&lt;?php echo "Снова код PHP!";'</literal>.
</para>
<para>
Строка кода должна быть корректным PHP-кодом. Требование включает и то,
что инструкции требуется правильно разделять точкой с запятой.
Строка <literal>'echo "Привет!"'</literal> сгенерирует ошибку синтаксиса,
а строка <literal>'echo "Привет!";'</literal> будет работать.
</para>
<para>
Инструкция <literal>return</literal> немедленно прекратит вычисление кода.
</para>
<para>
Код выполнится в области видимости кода, который вызывал конструкцию <function>eval</function>.
Поэтому переменные, которые определили или изменили в вызове <function>eval</function>,
сохранят видимость после завершения вызова конструкции.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Языковая конструкция <function>eval</function> возвращает значение &null;,
если только в вычисляемом коде не вызывается инструкция <literal>return</literal>.
Начиная с PHP 7, если в вычисляемом коде допустили синтаксическую ошибку,
конструкция <function>eval</function> выбрасывает исключение <classname>ParseError</classname>. До PHP 7 в таких случаях
<function>eval</function> возвращала логическое значение &false;, а следующий код
выполнялся в обычном режиме. Невозможно отловить синтаксическую ошибку в конструкции <function>eval</function>
функцией <function>set_error_handler</function>.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>
Пример использования языковой конструкции <function>eval</function> — простое слияние текста
</title>
<programlisting role="php">
<![CDATA[
<?php
$string = 'чашка';
$name = 'кофе';
$str = 'Это — $string $name.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Это — $string $name.
Это — чашка кофе.
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
&note.language-construct;
&tip.ob-capture;
<note>
<para>
Весь скрипт завершает работу, если в вычисляемом коде возникла фатальная ошибка.
</para>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>call_user_func</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
-->