1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 15:52:13 +01:00
Files
2025-06-30 13:32:15 +03:00

451 lines
19 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: 2916fa4160bdf53bb316a5c7c018fc91df7cd951 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.assert" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>assert</refname>
<refpurpose>Проверяет утверждение</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>bool</type><methodname>assert</methodname>
<methodparam><type>mixed</type><parameter>assertion</parameter></methodparam>
<methodparam choice="opt"><type class="union"><type>Throwable</type><type>string</type><type>null</type></type><parameter>description</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<para>
Функция <function>assert</function> определяет ожидания: утверждения,
которые проверяются в средах разработки и тестирования,
но перед развёртыванием в производственной среде код оптимизируют — удаляют проверки утверждений, чтобы исключить накладные расходы.
</para>
<para>
Утверждения помогают отлаживать код.
В одном случае утверждениями проверяют, выполняются ли предварительные условия:
корректные условия вычисляются как значение &true;, а ложность условий
указывает на ошибки программирования.
В другом сценарии проверяют доступность конкретной функции модуля
или не накладывает ли система конкретные ограничения.
</para>
<para>
Утверждения <emphasis>не</emphasis> включают в производственный код и не проверяют утверждениями стандартные операции времени выполнения
наподобие проверки входных параметров, поскольку код с утверждениями сломается, когда проверку ожиданий отключат в конфигурации PHP.
Поэтому в производственной среде разворачивают код, который работает правильно даже при отключении проверки утверждений.
</para>
<para>
Функция <function>assert</function> проверяет, выполняется ли ожидание,
установленное в параметре <parameter>assertion</parameter>.
Функция <function>assert</function> выполнит действие, которое сконфигурировали во втором параметре,
если условие не выполнилось и поэтому вернуло значения &false;.
</para>
<para>
Поведение конструкции <function>assert</function> определяется следующими INI-настройками:
<table>
<title>&ConfigureOptions; конструкции assert</title>
<tgroup cols="4">
<thead>
<row>
<entry>&Name;</entry>
<entry>&Default;</entry>
<entry>&Description;</entry>
<entry>&Changelog;</entry>
</row>
</thead>
<tbody>
<row>
<entry><link linkend="ini.zend.assertions">zend.assertions</link></entry>
<entry><literal>1</literal></entry>
<entry>
<simplelist>
<member>
<literal>1</literal>: генерирует и выполняет код. Значение указывают в режиме разработки
</member>
<member>
<literal>0</literal>: генерирует, но не выполняет код при выполнении
</member>
<member>
<literal>-1</literal>: не генерирует код. Значение указывают в производственном режиме
</member>
</simplelist>
</entry>
<entry/>
</row>
<row>
<entry><link linkend="ini.assert.active">assert.active</link></entry>
<entry>&true;</entry>
<entry>
Со значением &false; функция <function>assert</function> не проверяет ожидание
и возвращает &true; без проверки утверждения.
</entry>
<entry>
Директива устарела с PHP 8.3.0.
</entry>
</row>
<row>
<entry><link linkend="ini.assert.callback">assert.callback</link></entry>
<entry>&null;</entry>
<entry>
<para>
Пользовательская функция, которая вызывается, если утверждение не прошло проверку.
Callback-функцию определяют со следующей сигнатурой:
<methodsynopsis role="procedural">
<type>void</type><methodname>assert_callback</methodname>
<methodparam><type>string</type><parameter>file</parameter></methodparam>
<methodparam><type>int</type><parameter>line</parameter></methodparam>
<methodparam><type>null</type><parameter>assertion</parameter></methodparam>
<methodparam choice="opt"><type>string</type><parameter>description</parameter></methodparam>
</methodsynopsis>
</para>
</entry>
<entry>
<para>
До PHP 8.0.0 сигнатуру callback-функции определяли так:
<methodsynopsis role="procedural">
<type>void</type><methodname>assert_callback</methodname>
<methodparam><type>string</type><parameter>file</parameter></methodparam>
<methodparam><type>int</type><parameter>line</parameter></methodparam>
<methodparam><type>string</type><parameter>assertion</parameter></methodparam>
<methodparam choice="opt"><type>string</type><parameter>description</parameter></methodparam>
</methodsynopsis>
</para>
<simpara>
Директива устарела с PHP 8.3.0.
</simpara>
</entry>
</row>
<row>
<entry><link linkend="ini.assert.exception">assert.exception</link></entry>
<entry>&true;</entry>
<entry>
Со значением &true; функция выбрасывает исключение <classname>AssertionError</classname>,
если ожидание не оправдалось.
</entry>
<entry>
Директива устарела с PHP 8.3.0.
</entry>
</row>
<row>
<entry><link linkend="ini.assert.bail">assert.bail</link></entry>
<entry>&false;</entry>
<entry>
Со значением &true; выполнение PHP-скрипта прервётся, если ожидание не оправдалось.
</entry>
<entry>
Директива устарела с PHP 8.3.0.
</entry>
</row>
<row>
<entry><link linkend="ini.assert.warning">assert.warning</link></entry>
<entry>&true;</entry>
<entry>
Со значением &true; функция выдаёт ошибку уровня <constant>E_WARNING</constant>,
если ожидание не оправдалось.
INI-настройка не работает, если включили директиву <link linkend="ini.assert.exception">assert.exception</link>.
</entry>
<entry>
Директива устарела с PHP 8.3.0.
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>assertion</parameter></term>
<listitem>
<para>
Выражение, значение возврата которого выполняется,
а резлультат выполнения указывает, прошло ли утверждение проверку.
</para>
<warning>
<para>
До PHP 8.0.0 аргумент с типом <type>string</type> для параметра <parameter>assertion</parameter>
интерпретировался как PHP-код и выполнялся функцией <function>eval</function>.
Эта строка передавалась в callback-функцию как третий аргумент.
Это поведение <emphasis>УСТАРЕЛО</emphasis> в PHP 7.2.0, а в PHP 8.0.0 поведение <emphasis>УДАЛИЛИ</emphasis>.
</para>
</warning>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>description</parameter></term>
<listitem>
<para>
При передаче в параметр <parameter>description</parameter> значения
с типом <classname>Throwable</classname> функция выбрасывает исключение,
но только если утверждение <parameter>assertion</parameter> не прошло проверку.
<note>
<para>
Начиная с PHP 8.0.0 исключение выбрасывается <emphasis>до</emphasis> вызова
callback-функции утверждения, если такой пользовательский обработчик определили.
</para>
</note>
<note>
<para>
Начиная с PHP 8.0.0 объект (&object;) исключения выбрасывается независимо от конфигурации директивы
<link linkend="ini.assert.exception">assert.exception</link>.
</para>
</note>
<note>
<para>
Начиная с PHP 8.0.0 настройка <link linkend="ini.assert.bail">assert.bail</link>
не работает, если в параметр передали объект исключения и утверждение не прошло проверку.
</para>
</note>
</para>
<para>
При передаче в параметр <parameter>description</parameter> значения с типом &string;
это сообщение появится в исключении или предупреждении.
Необязательное описание, которое функция включит в сообщение,
если утверждение <parameter>assertion</parameter> не пройдет проверку.
</para>
<para>
При пропуске параметра <parameter>description</parameter>
PHP на этапе компиляции сгенерирует описание ошибки, эквивалентное строке исходного кода
самого утверждения <function>assert</function>.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Функция <function>assert</function> возвращает значение &true;,
если хотя бы одно из следующих утверждений истинно:
</para>
<simplelist>
<member><literal>zend.assertions=0</literal></member>
<member><literal>zend.assertions=-1</literal></member>
<member><literal>assert.active=0</literal></member>
<member><literal>assert.exception=1</literal></member>
<member><literal>assert.bail=1</literal></member>
<member>В параметр <parameter>description</parameter> передали объект пользовательского исключения.</member>
</simplelist>
<para>
Функция <function>assert</function> проверяет утверждения
и возвращает &true; при истинности аргумента <parameter>assertion</parameter>,
но только если ни одно из отключающих проверки условий не выполняется,
иначе функция возвращает &false;.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.3.0</entry>
<entry>
INI-настройки <literal>assert.</literal> устарели.
</entry>
</row>
<row>
<entry>8.0.0</entry>
<entry>
Функция <function>assert</function> больше не оценивает строковые аргументы,
вместо этого строки рассматриваются как любой другой аргумент.
Вместо <code>assert('$a == $b')</code> лучше вызывать assert($a == $b).
Директиву <literal>assert.quiet_eval</literal> &php.ini; и константу <constant>ASSERT_QUIET_EVAL</constant>
тоже удалили, поскольку они больше не дают никакого эффекта.
</entry>
</row>
<row>
<entry>8.0.0</entry>
<entry>
При передаче в параметр <parameter>description</parameter> экземпляра класса <classname>Throwable</classname>
исключение выбрасывается, если утверждение не прошло проверку,
независимо от значения опции <link linkend="ini.assert.exception">assert.exception</link>.
</entry>
</row>
<row>
<entry>8.0.0</entry>
<entry>
При передаче в параметр <parameter>description</parameter> экземпляра класса <classname>Throwable</classname>
пользовательская callback-функция не вызывается, даже если её установили.
</entry>
</row>
<row>
<entry>8.0.0</entry>
<entry>
Объявление пользовательской функции с названием <literal>assert()</literal> запретили,
даже внутри пространства имён. Попытка объявить функцию выдаст ошибку уровня <constant>E_COMPILE_ERROR</constant>.
</entry>
</row>
<row>
<entry>7.3.0</entry>
<entry>
Объявление пользовательской функции с названием <literal>assert()</literal> устарело,
даже внутри пространства имён. Объявление функции теперь выдаёт ошибку уровня <constant>E_DEPRECATED</constant>.
</entry>
</row>
<row>
<entry>7.2.0</entry>
<entry>
Передача в параметр <parameter>assertion</parameter> утверждений в значении с типом <type>string</type>
устарела. Функция теперь выдаст ошибку уровня <constant>E_DEPRECATED</constant>,
когда и для опции <link linkend="ini.assert.active">assert.active</link>,
и для опции <link linkend="ini.zend.assertions">zend.assertions</link> установили значение <literal>1</literal>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title>Пример проверки утверждения функцией <function>assert</function></title>
<programlisting role="php">
<![CDATA[
<?php
assert(1 > 2);
echo 'Привет!';
?>
]]>
</programlisting>
<para>
Приведённый пример выведет следующее,
если утверждения включили в директиве <link linkend="ini.zend.assertions"><literal>zend.assertions=1</literal></link>:
</para>
<screen>
<![CDATA[
Fatal error: Uncaught AssertionError: assert(1 > 2) in example.php:2
Stack trace:
#0 example.php(2): assert(false, 'assert(1 > 2)')
#1 {main}
thrown in example.php on line 2
]]>
</screen>
<para>
Приведённый пример выведет следующее,
если утверждения отключили путём установки для директивы значений <literal>zend.assertions=0</literal> или <literal>zend.assertions=-1</literal>:
</para>
<screen>
<![CDATA[
Привет!
]]>
</screen>
</example>
<example>
<title>Пример пользовательского сообщения</title>
<programlisting role="php">
<![CDATA[
<?php
assert(1 > 2, "Ожидается, что один больше двух");
echo 'Привет!';
?>
]]>
</programlisting>
<para>
Приведённый пример выведет следующее, если утверждения включили:
</para>
<screen>
<![CDATA[
Fatal error: Uncaught AssertionError: Ожидается, что один больше двух in example.php:2
Stack trace:
#0 example.php(2): assert(false, 'Expected one to...')
#1 {main}
thrown in example.php on line 2
]]>
</screen>
<para>
Приведённый пример выведет следующее, если утверждения выключили:
</para>
<screen>
<![CDATA[
Привет!
]]>
</screen>
</example>
<example>
<title>Пример пользовательского класса ошибок</title>
<programlisting role="php">
<![CDATA[
<?php
class ArithmeticAssertionError extends AssertionError {}
assert(1 > 2, new ArithmeticAssertionError("Ожидается, что один больше двух"));
echo 'Hi!';
?>
]]>
</programlisting>
<para>
Приведённый пример выведет следующее, если утверждения включили:
</para>
<screen>
<![CDATA[
Fatal error: Uncaught ArithmeticAssertionError: Ожидается, что один больше двух in example.php:4
Stack trace:
#0 {main}
thrown in example.php on line 4
]]>
</screen>
<para>
Приведённый пример выведет следующее, если утверждения выключили:
</para>
<screen>
<![CDATA[
Привет!
]]>
</screen>
</example>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>assert_options</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
-->