1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 07:42:22 +01:00
Files
2025-05-06 04:34:47 +03:00

169 lines
7.1 KiB
XML
Raw Permalink 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>'&lt;?php echo "Привет!"; &gt;'</literal>
в конструкцию передают строку <literal>'echo "Привет!";'</literal>.
Переключаться между режимом PHP-кода и HTML-разметки помогают открывающие и закрывающие PHP-теги:
<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>set_error_handler</function>, не перехватывают синтаксические ошибки
в конструкции <function>eval</function>.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>
Пример выполнения строки PHP-кода языковой конструкцией <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
-->