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/info/functions/assert.xml
2024-04-28 01:25:48 +03:00

451 lines
18 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: 27dcb487a7e9c0f04559522a6d2aacf860d622cd 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> следует использовать для обычных операций во время выполнения,
таких как проверка входных параметров.
Как правило, код должен вести себя так, как ожидается, даже если проверка утверждений отключена.
</para>
<para>
Функция <function>assert</function> проверяет, выполняется ли ожидание,
заданное в параметре <parameter>assertion</parameter>.
Если нет, и в результате вернулось значение &false;,
то функция <function>assert</function> выполнит заданное конфигурацией действие.
</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>
Пользовательская функция, вызываемая при неудачной проверке утверждения.
Сигнатура функции должна соответствовать определению:
<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, если утверждение <parameter>assertion</parameter> было
строкой (<type>string</type>), утверждение интерпретировалось как PHP-код
и выполнялось функцией <function>eval</function>.
Эта строка передавалась в callback-функцию как третий аргумент.
Это поведение объявили <emphasis>УСТАРЕВШИМ</emphasis> в PHP 7.2.0 и <emphasis>УДАЛИЛИ</emphasis> в PHP 8.0.0.
</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> опустили.
Во время компиляции создаётся описание по умолчанию,
равное исходному коду для вызова <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.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>
Строка (<type>string</type>) как <parameter>assertion</parameter>
устарела. Теперь выдаётся ошибка уровня <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> or <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
-->