1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 07:42:22 +01:00
Files
archived-doc-ru/language/operators/functional.xml
2026-01-03 13:43:59 +03:00

118 lines
4.6 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: 2f1812217524ac60414745bad05cbbee00262b3b Maintainer: malferov Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.operators.functional">
<title>Функциональный оператор</title>
<titleabbrev>Функциональность</titleabbrev>
<para>
PHP версии 8.5 и новее поддерживает один оператор, который работает с callable-выражениями. Оператор <literal>|&gt;</literal>,
или оператор конвейеризации, принимает в правой части callable-выражение с единственным параметром,
передаёт в него значение левой части и возвращает результат вычисления вызываемого выражения. В правой части
оператор принимает допустимое в PHP callable-выражение: объект класса <classname>Closure</classname>,
<link linkend="functions.first_class_callable_syntax">callable-выражение как объект первого класса</link>,
объект, класс которого реализует метод <link linkend="object.invoke">__invoke()</link>, и другие вызываемые значения.
</para>
<para>
Каждые две следующие строки эквивалентны.
<example>
<title>Оператор <literal>|&gt;</literal></title>
<programlisting role="php">
<![CDATA[
<?php
$result = "Привет, мир!" |> strlen(...);
print $result, PHP_EOL;
$result = strlen("Привет, мир!");
print $result, PHP_EOL;
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
21
21
]]>
</screen>
</example>
</para>
<para>
Конвейерный оператор с единственным вызовом бесполезен, но принесёт пользу при множественных вызовах, которые объединяются в цепочку.
Следующие два фрагмента кода эквивалентны:
<example>
<title>Цепочка вызовов через оператор |&gt;</title>
<programlisting role="php">
<![CDATA[
<?php
$result = "PHP Rocks"
|> htmlentities(...)
|> str_split(...)
|> (fn($x) => array_map(strtoupper(...), $x))
|> (fn($x) => array_filter($x, fn($v) => $v != 'O'));
print_r($result);
$temp = "PHP Rocks";
$temp = htmlentities($temp);
$temp = str_split($temp);
$temp = array_map(strtoupper(...), $temp);
$temp = array_filter($temp, fn($v) => $v != 'O');
$result = $temp;
print_r($result);
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[0] => P
[1] => H
[2] => P
[3] =>
[4] => R
[6] => C
[7] => K
[8] => S
)
Array
(
[0] => P
[1] => H
[2] => P
[3] =>
[4] => R
[6] => C
[7] => K
[8] => S
)
]]>
</screen>
</example>
</para>
<para>
В левой части оператор конвейера принимает произвольное значение или выражение,
а в правой — допустимое в PHP callable-выражение, которое принимает только один аргумент.
Функции с двумя или больше обязательными параметрами
не сработают и вызовут ошибку, как при стандартном вызове с недостаточным количеством
аргументов. В правой части оператора нельзя указывать функции, которые принимают переменную по ссылке.
PHP выбросит ошибку Error, если в правую часть оператора передали значение, которое невозможно вызвать как функцию.
</para>
<note>
<para>
<link linkend="functions.arrow">Стрелочные функции</link> в правой части оператора конвейеризации
ОБЯЗАТЕЛЬНО указывают в круглых скобках, чтобы избежать синтаксической двусмысленности, как в предыдущем примере.
При нарушении требования PHP выдаст фатальную ошибку.
</para>
</note>
<sect2 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><classname>Closure</classname></member>
</simplelist>
</para>
</sect2>
</sect1>