svn: /phpdoc/ru/trunk/language/ functions.xml

[email protected] (Sergey Panteleev) Sat, 14 Nov 2020 07:02:16 +0000
Newsgroups php.doc.ru
Message-ID <[email protected]>
sergey                                   Sat, 14 Nov 2020 07:02:16 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=351389

Log:
docs(ru): Updated to English revision

Changed paths:
    U   phpdoc/ru/trunk/language/functions.xml
svn-diffs-351389.txt (text/x-diff, 41.3 KB)
Modified: phpdoc/ru/trunk/language/functions.xml
===================================================================
--- phpdoc/ru/trunk/language/functions.xml	2020-11-14 06:26:51 UTC (rev 351388)
+++ phpdoc/ru/trunk/language/functions.xml	2020-11-14 07:02:16 UTC (rev 351389)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 350788 Maintainer: sergey Status: ready -->
+<!-- EN-Revision: 351365 Maintainer: sergey Status: ready -->
 <!-- Reviewed: yes -->

 <chapter xml:id="language.functions" xmlns="http://docbook.org/ns/docbook">
@@ -358,443 +358,42 @@
    </para>
    <note>
     <simpara>
-     Начиная с PHP 5, значения по умолчанию могут быть переданы по ссылке.
+     Значения по умолчанию могут быть переданы по ссылке.
     </simpara>
    </note>
   </sect2>

-  <sect2 xml:id="functions.arguments.type-declaration">
-   <title>Объявление типов</title>
+  <sect2 xml:id="functions.variable-arg-list">
+   <title>Списки аргументов переменной длины</title>

+   <simpara>
+    PHP поддерживает списки аргументов переменной длины для функций,
+    определяемых пользователем с помощью добавления
+    многоточия (<literal>...</literal>).
+   </simpara>
+
    <note>
-    <para>
-     Объявление типов также известно, как подсказки для типов в PHP 5.
-    </para>
+    <simpara>
+     Также можно добиться аргументов переменной длины, используя функции
+     <function>func_num_args</function>,
+     <function>func_get_arg</function> и
+     <function>func_get_args</function>.
+     Этот метод не рекомендуется, поскольку он использовался до введения.
+     токена <literal>...</literal>.
+    </simpara>
    </note>

    <para>
-    Объявления типов позволяют функциям строго задавать тип передаваемых параметров. Передача в
-    функцию значений несоответствующего типа будет приводить к ошибке: в PHP 5 это будет
-    обрабатываемая фатальная ошибка, а в PHP 7 будет выбрасываться исключение
-    <classname>TypeError</classname>.
-   </para>
-
-   <para>
-    Чтобы объявить тип аргумента, необходимо перед его именем добавить имя требуемого типа.
-    Объявление типов может принимать значения &null;, если значение по умолчанию для аргумента является &null;.
-   </para>
-
-   <sect3 xml:id="functions.arguments.type-declaration.types">
-    <title>Допустимые типы</title>
-    <informaltable>
-     <tgroup cols="3">
-      <thead>
-       <row>
-        <entry>Тип</entry>
-        <entry>Описание</entry>
-        <entry>Минимальная версия PHP</entry>
-       </row>
-      </thead>
-      <tbody>
-       <row>
-        <entry>Имя класса/интерфейса</entry>
-        <entry>
-         Аргумент должен быть &instanceof;, что и имя класса или интерфейса.
-        </entry>
-        <entry>PHP 5.0.0</entry>
-       </row>
-       <row>
-        <entry><literal>self</literal></entry>
-        <entry>
-         Этот параметр должен быть &instanceof; того же класса, в методе
-         которого он указан. Это можно использовать только в методах
-         класса или экземпляра.
-        </entry>
-        <entry>PHP 5.0.0</entry>
-       </row>
-       <row>
-        <entry><type>array</type></entry>
-        <entry>
-         Аргумент должен быть типа <type>array</type>.
-        </entry>
-        <entry>PHP 5.1.0</entry>
-       </row>
-       <row>
-        <entry><type>callable</type></entry>
-        <entry>
-         Аргумент должен быть корректным <type>callable</type>-типом.
-        </entry>
-        <entry>PHP 5.4.0</entry>
-       </row>
-       <row>
-        <entry><type>bool</type></entry>
-        <entry>
-         Аргумент должен быть типа <type>boolean</type>.
-        </entry>
-        <entry>PHP 7.0.0</entry>
-       </row>
-       <row>
-        <entry><type>float</type></entry>
-        <entry>
-         Аргумент должен быть типа <type>float</type>.
-        </entry>
-        <entry>PHP 7.0.0</entry>
-       </row>
-       <row>
-        <entry><type>int</type></entry>
-        <entry>
-         Аргумент должен быть типа <type>integer</type>.
-        </entry>
-        <entry>PHP 7.0.0</entry>
-       </row>
-       <row>
-        <entry><type>string</type></entry>
-        <entry>
-         Аргумент должен иметь тип <type>string</type>.
-        </entry>
-        <entry>PHP 7.0.0</entry>
-       </row>
-       <row>
-        <entry><literal>iterable</literal></entry>
-        <entry>
-         Параметр должен быть либо массивом, либо экземпляром класса, реализующего <classname>Traversable</classname>.
-        </entry>
-        <entry>PHP 7.1.0</entry>
-       </row>
-       <row>
-        <entry><literal>object</literal></entry>
-        <entry>
-         Параметр должен быть объектом (<type>object</type>).
-        </entry>
-        <entry>PHP 7.2.0</entry>
-       </row>
-      </tbody>
-     </tgroup>
-    </informaltable>
+    Список аргументов может содержать многоточие
+    <literal>...</literal>, чтобы показать, что функция принимает переменное
+    количество аргументов. Аргументы в этом случае будут переданы в виде массива.
+    Например:

-    <warning>
-     <para>
-      Псевдонимы для вышеперечисленных скалярных типов не поддерживаются.
-      Вместо этого они рассматриваются как имена классов или интерфейсов.
-      К примеру, используя <literal>boolean</literal> как параметр или
-      возвращаемое значение, потребует, чтобы эти аргумент или
-      возвращаемое значение были &instanceof; класса или интерфейса
-      <literal>boolean</literal>, а не типа <type>bool</type>:
-     </para>
-     <para>
-      <example>
-       <programlisting role="php">
-<![CDATA[
- <?php
- function test(boolean $param) {}
- test(true);
- ?>
- ]]>
-       </programlisting>
-       &example.outputs;
-       <screen>
-<![CDATA[
- Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of boolean, boolean given, called in - on line 1 and defined in -:1
- ]]>
-       </screen>
-      </example>
-     </para>
-    </warning>
-   </sect3>
-
-   <sect3 xml:id="functions.arguments.type-declaration.examples">
-    &reftitle.examples;
     <example>
-     <title>Объявление типа базового класса</title>
+     <title>Использование <literal>...</literal> для доступа к аргументам</title>
      <programlisting role="php">
 <![CDATA[
 <?php
-class C {}
-class D extends C {}
-
-// Это не является расширением класса C.
-class E {}
-
-function f(C $c) {
-    echo get_class($c)."\n";
-}
-
-f(new C);
-f(new D);
-f(new E);
-?>
-]]>
-     </programlisting>
-     &example.outputs;
-     <screen>
-<![CDATA[
-C
-D
-
-Fatal error: Uncaught TypeError: Argument 1 passed to f() must be an instance of C, instance of E given, called in - on line 14 and defined in -:8
-Stack trace:
-#0 -(14): f(Object(E))
-#1 {main}
-  thrown in - on line 8
-]]>
-     </screen>
-    </example>
-
-    <example>
-     <title>Объявление типа базового интерфейса</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-interface I { public function f(); }
-class C implements I { public function f() {} }
-
-// Это не реализует интерфейс I.
-class E {}
-
-function f(I $i) {
-    echo get_class($i)."\n";
-}
-
-f(new C);
-f(new E);
-?>
-]]>
-     </programlisting>
-     &example.outputs;
-     <screen>
-<![CDATA[
-C
-
-Fatal error: Uncaught TypeError: Argument 1 passed to f() must implement interface I, instance of E given, called in - on line 13 and defined in -:8
-Stack trace:
-#0 -(13): f(Object(E))
-#1 {main}
-  thrown in - on line 8
-]]>
-     </screen>
-    </example>
-
-    <example>
-     <title>Типизированные параметры, передаваемые по ссылке</title>
-     <simpara>
-      Объявленные типы параметров-ссылок проверяются при вызове функции,
-      но не при возврате функции, поэтому после того,
-      как функция вернула значение, тип аргумента может измениться.
-     </simpara>
-     <programlisting role="php">
-<![CDATA[
-<?php
-function array_baz(array &$param)
-{
-    $param = 1;
-}
-$var = [];
-array_baz($var);
-var_dump($var);
-array_baz($var);
-?>
-]]>
-     </programlisting>
-     &example.outputs.similar;
-     <screen>
-     <![CDATA[
-     int(1)
-
-     Fatal error: Uncaught TypeError: Argument 1 passed to array_baz() must be of the type array, int given, called in %s on line %d
-     ]]>
-     </screen>
-    </example>
-
-    <example>
-     <title>Обнуляемое объявление типа</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class C {}
-
-function f(C $c = null) {
-    var_dump($c);
-}
-
-f(new C);
-f(null);
-?>
-]]>
-     </programlisting>
-     &example.outputs;
-     <screen>
-<![CDATA[
-object(C)#1 (0) {
-}
-NULL
-]]>
-     </screen>
-    </example>
-   </sect3>
-
-   <sect3 xml:id="functions.arguments.type-declaration.strict">
-    <title>Строгая типизация</title>
-
-    <para>
-     По умолчанию PHP будет пытаться привести значения несоответствующих типов
-     к скалярному типу, если это возможно. Например, если в функцию передается
-     целое число (<type>integer</type>), а тип аргумента объявлен как строка
-     (<type>string</type>), в итоге
-     функция получит преобразованное в строку (<type>string</type>) значение.
-    </para>
-
-    <para>
-     Для отдельных файлов можно включать режим строгой типизации. В этом режиме
-     в функцию можно передавать значения только тех типов, которые объявлены для
-     аргументов. В противном случае будет выбрасываться исключение
-     <classname>TypeError</classname>. Есть лишь одно исключение -
-     целое число (<type>integer</type>)
-     можно передать в функцию, которая ожидает значение типа <type>float</type>.
-     Вызовы функций внутри встроенных функций не будут затронуты
-     директивой <literal>strict_types</literal>.
-    </para>
-
-    <para>
-     Для включения режима строгой типизации используется выражение &declare; в объявлении
-     <literal>strict_types</literal>:
-    </para>
-
-    <caution>
-     <para>
-      Включение режима строгой типизации также повлияет на
-      <link linkend="functions.returning-values.type-declaration">объявления типов возвращаемых
-       значений</link>.
-     </para>
-    </caution>
-
-    <note>
-     <para>
-      Режим строгой типизации распространяется на вызовы функций, совершенные
-      <emphasis>из</emphasis> файла, в котором этот режим включен, а не на функции, которые в
-      этом файле объявлены. Если файл без строгой типизации вызывает функцию, которая объявлена в
-      файле с включенным режимом, значения аргументов будут приведены к нужным типам и ошибок
-      не последует.
-     </para>
-    </note>
-
-    <note>
-     <para>
-      Строгая типизация применима только к скалярным типам и работает только в PHP 7.0.0 и выше.
-      Равно как и сами объявления скалярных типов добавлены в этой версии.
-     </para>
-    </note>
-
-    <example>
-     <title>Строгая типизация</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-declare(strict_types=1);
-
-function sum(int $a, int $b) {
-    return $a + $b;
-}
-
-var_dump(sum(1, 2));
-var_dump(sum(1.5, 2.5));
-?>
-]]>
-     </programlisting>
-     &example.outputs;
-     <screen>
-<![CDATA[
-int(3)
-
-Fatal error: Uncaught TypeError: Argument 1 passed to sum() must be of the type integer, float given, called in - on line 9 and defined in -:4
-Stack trace:
-#0 -(9): sum(1.5, 2.5)
-#1 {main}
-  thrown in - on line 4
-]]>
-     </screen>
-    </example>
-
-    <example>
-     <title>Слабая типизация</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-function sum(int $a, int $b) {
-    return $a + $b;
-}
-
-var_dump(sum(1, 2));
-
-// Будут приведены к целым числам: обратите внимание на результат ниже!
-var_dump(sum(1.5, 2.5));
-?>
-]]>
-     </programlisting>
-     &example.outputs;
-     <screen>
-<![CDATA[
-int(3)
-int(3)
-]]>
-     </screen>
-    </example>
-
-    <example>
-     <title>Обработка исключения <classname>TypeError</classname></title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-declare(strict_types=1);
-
-function sum(int $a, int $b) {
-    return $a + $b;
-}
-
-try {
-    var_dump(sum(1, 2));
-    var_dump(sum(1.5, 2.5));
-} catch (TypeError $e) {
-    echo 'Ошибка: '.$e->getMessage();
-}
-?>
-]]>
-     </programlisting>
-     &example.outputs;
-     <screen>
-<![CDATA[
-int(3)
-Ошибка: Argument 1 passed to sum() must be of the type integer, float given, called in - on line 10
-]]>
-     </screen>
-    </example>
-   </sect3>
-  </sect2>
-  <sect2 xml:id="functions.variable-arg-list">
-   <title>Списки аргументов переменной длины</title>
-
-   <simpara>
-    PHP поддерживает списки аргументов переменной длины для функций,
-    определяемых пользователем. Для версий PHP 5.6 и выше это делается
-    добавлением многоточия (<literal>...</literal>). Для версий 5.5 и старше
-    используются функции <function>func_num_args</function>,
-    <function>func_get_arg</function> и
-    <function>func_get_args</function>.
-   </simpara>
-
-   <sect3 xml:id="functions.variable-arg-list.new">
-    <title><literal>...</literal> в PHP 5.6+</title>
-
-    <para>
-     В версиях PHP 5.6 и выше список аргументов может содержать многоточие
-     <literal>...</literal>, чтобы показать, что функция принимает переменное
-     количество аргументов. Аргументы в этом случае будут переданы в виде массива.
-     Например:
-
-     <example>
-      <title>Использование <literal>...</literal> для доступа к аргументам</title>
-      <programlisting role="php">
-<![CDATA[
-<?php
 function sum(...$numbers) {
     $acc = 0;
     foreach ($numbers as $n) {
@@ -814,16 +413,16 @@
 ]]>
       </screen>
      </example>
-    </para>
+   </para>
+
+   <para>
+    Многоточие (<literal>...</literal>) можно использовать при вызове функции,
+    чтобы распаковать массив (<type>array</type>) или <classname>Traversable</classname>
+    переменную в список аргументов:

-    <para>
-     Многоточие (<literal>...</literal>) можно использовать при вызове функции,
-     чтобы распаковать массив (<type>array</type>) или <classname>Traversable</classname>
-     переменную в список аргументов:
-
-     <example>
-      <title>Использование <literal>...</literal> для передачи аргументов</title>
-      <programlisting role="php">
+    <example>
+     <title>Использование <literal>...</literal> для передачи аргументов</title>
+     <programlisting role="php">
 <![CDATA[
 <?php
 function add($a, $b) {
@@ -845,24 +444,24 @@
 ]]>
       </screen>
      </example>
-    </para>
+   </para>
+
+   <para>
+    Можно задать несколько аргументов в привычном виде, а затем добавить
+    <literal>...</literal>. В этом случае <literal>...</literal> поместит
+    в массив только те аргументы, которые не нашли соответствия указанным
+    в объявлении функции.
+   </para>
+
+   <para>
+    Также можно добавить
+    <link linkend="language.types.declarations">объявление типов</link> перед
+    <literal>...</literal>. В этом случае PHP будет следить, чтобы все аргументы
+    обработанные многоточием (<literal>...</literal>) были того же типа, что указан в подсказке.

-    <para>
-     Можно задать несколько аргументов в привычном виде, а затем добавить
-     <literal>...</literal>. В этом случае <literal>...</literal> поместит
-     в массив только те аргументы, которые не нашли соответствия указанным
-     в объявлении функции.
-    </para>
-
-    <para>
-     Также можно добавить
-     <link linkend="language.oop5.typehinting">подсказку типа</link> перед
-     <literal>...</literal>. В этом случае PHP будет следить, чтобы все аргументы
-     обработанные многоточием (<literal>...</literal>) были того же типа, что указан в подсказке.
-
-     <example>
-      <title>Аргументы с подсказкой типов</title>
-      <programlisting role="php">
+    <example>
+     <title>Аргументы с подсказкой типов</title>
+     <programlisting role="php">
 <![CDATA[
 <?php
 function total_intervals($unit, DateInterval ...$intervals) {
@@ -890,16 +489,15 @@
 ]]>
       </screen>
      </example>
-    </para>
-
-    <para>
-     В конце концов, можно передавать аргументы
-     <link linkend="functions.arguments.by-reference">по ссылке</link>. Для этого
-     перед <literal>...</literal> нужно поставить амперсанд
-     (<literal>&amp;</literal>).
-    </para>
-   </sect3>
+   </para>

+   <para>
+    В конце концов, можно передавать аргументы
+    <link linkend="functions.arguments.by-reference">по ссылке</link>. Для этого
+    перед <literal>...</literal> нужно поставить амперсанд
+    (<literal>&amp;</literal>).
+   </para>
+
    <sect3 xml:id="functions.variable-arg-list.old">
     <title>Предыдущие версии PHP</title>

@@ -913,10 +511,10 @@

     <para>
      В первом примере выше было показано, как задать список аргументов переменной длины
-     для версий PHP 5.5 и более ранних:
+     для предыдущих версий PHP:

      <example>
-      <title>Доступ к аргументам в PHP 5.5 и ранних версий</title>
+      <title>Доступ к аргументам в предыдущих версиях PHP</title>
       <programlisting role="php">
 <![CDATA[
 <?php
@@ -940,7 +538,7 @@
       </screen>
      </example>
     </para>
-   </sect3>
+   </sect3>

   </sect2>
  </sect1>
@@ -1029,147 +627,6 @@
     к разделу документации <link linkend="language.references">Подробно о ссылках</link>.
    </simpara>
   </sect2>
-
-  <sect2 xml:id="functions.returning-values.type-declaration">
-   <title>Объявление типов возвращаемых значений</title>
-
-   <para>
-    В PHP 7 добавлена возможность объявлять тип возвращаемого значения. Аналогично
-    <link linkend="functions.arguments.type-declaration">объявлению типов аргументов</link>
-    можно задать тип значения, которое будет возвращаться функцией.
-    <link linkend="functions.arguments.type-declaration.types">Типы</link>, которые можно
-    объявить для возвращаемых значений те же, что и для аргументов функций.
-   </para>
-
-   <para>
-    <link linkend="functions.arguments.type-declaration.strict">Режим строгой типизации</link>
-    также работает при объявлении типа возвращаемого значения. В режиме слабой типизации
-    по умолчанию возвращаемые значения будут приводиться к корректному типу, если они
-    еще не относятся к этому типу. Если это преобразование типа не разрешено
-    (например, при возврате массива (&array;) из функции с возвращаемым типом целое число (&integer;)),
-    будет выброшена ошибка <classname>TypeError</classname>.
-    При строгой типизации возвращаемое значение должно быть заданного типа, иначе будет выброшено
-    исключение <classname>TypeError</classname>.
-   </para>
-
-   <para>
-    Начиная с PHP 7.1.0, операторы возврата без триггера аргумента <constant>E_COMPILE_ERROR</constant>,
-    если только тип возврата не <type>void</type>, и в этом случае операторы возврата
-    с аргументом вызывают эту ошибку.
-   </para>
-
-   <para>
-    Начиная с PHP 7.1.0 возвращаемые значения могут быть помечены как обнуляемые,
-    путём добавления префикса в виде вопросительного знака (<literal>?</literal>)
-    к названию типу. Это означает, что функция возвращает либо значение
-    указанного типа, либо значение &null;.
-   </para>
-
-   <note>
-    <para>
-     Если переопределяется родительский метод, возвращаемое значение дочернего метода должно
-     быть того же типа, что и родительского. Если в родительском методе не задан тип возвращаемого
-     значения, то в дочернем методе можно указать любой.
-    </para>
-   </note>
-
-   <sect3 xml:id="functions.returning-values.type-declaration.examples">
-    &reftitle.examples;
-
-    <example>
-     <title>Обычное объявление типа возвращаемого значения</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-function sum($a, $b): float {
-    return $a + $b;
-}
-
-// Будет возвращаться значение типа float.
-var_dump(sum(1, 2));
-?>
-]]>
-     </programlisting>
-     &example.outputs;
-     <screen>
-<![CDATA[
-float(3)
-]]>
-     </screen>
-    </example>
-
-    <example>
-     <title>То же в режиме строгой типизации</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-declare(strict_types=1);
-
-function sum($a, $b): int {
-    return $a + $b;
-}
-
-var_dump(sum(1, 2));
-var_dump(sum(1, 2.5));
-?>
-]]>
-     </programlisting>
-     &example.outputs;
-     <screen>
-<![CDATA[
-int(3)
-
-Fatal error: Uncaught TypeError: Return value of sum() must be of the type integer, float returned in - on line 5 in -:5
-Stack trace:
-#0 -(9): sum(1, 2.5)
-#1 {main}
-  thrown in - on line 5
-]]>
-     </screen>
-    </example>
-
-    <example>
-     <title>Возврат объектов</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-class C {}
-
-function getC(): C {
-    return new C;
-}
-
-var_dump(getC());
-?>
-]]>
-     </programlisting>
-     &example.outputs;
-     <screen>
-<![CDATA[
-object(C)#1 (0) {
-}
-]]>
-     </screen>
-    </example>
-
-    <example>
-     <title>Объявление обнуляемого типа (начиная с PHP 7.1.0)</title>
-     <programlisting role="php">
-<![CDATA[
-<?php
-function get_item(): ?string {
-    if (isset($_GET['item'])) {
-        return $_GET['item'];
-    } else {
-        return null;
-    }
-}
-?>
-]]>
-     </programlisting>
-    </example>
-   </sect3>
-  </sect2>
  </sect1>

  <sect1 xml:id="functions.variable-functions">
@@ -1284,9 +741,8 @@
    </example>
   </para>
   <para>
-   С версии PHP 5.4.0, можно вызывать <type>callable</type>-функцию, помещенную в переменную.
    <example>
-    <title>Сallable-фукнции</title>
+    <title>Сложные callable-фукнции</title>
     <programlisting role="php">
 <![CDATA[
 <?php
@@ -1307,7 +763,7 @@
 $func = array(new Foo, "baz");
 $func(); // выведет "baz"
 $func = "Foo::bar";
-$func(); // выведет "bar" в PHP 7.0.0 и выше; в предыдущих версиях это приведет к фатальной ошибке
+$func(); // выведет "bar"
 ?>
 ]]>
     </programlisting>
@@ -1314,41 +770,17 @@
    </example>
   </para>

-  <para>
-   Смотрите также <function>is_callable</function>, <function>call_user_func</function>,
-   <link linkend="language.variables.variable">Переменные переменные</link> и
-   <function>function_exists</function>.
-  </para>
-
-  <sect2 role="changelog">
-   &reftitle.changelog;
-   <para>
-    <informaltable>
-     <tgroup cols="2">
-      <thead>
-       <row>
-        <entry>&Version;</entry>
-        <entry>&Description;</entry>
-       </row>
-      </thead>
-      <tbody>
-       <row>
-        <entry>7.0.0</entry>
-        <entry>
-         'ClassName::methodName' доступна как функция-переменная.
-        </entry>
-       </row>
-       <row>
-        <entry>5.4.0</entry>
-        <entry>
-         Массивы, являющиеся корректными callable-методами, доступны как функции-переменные.
-        </entry>
-       </row>
-      </tbody>
-     </tgroup>
-    </informaltable>
-   </para>
-  </sect2>
+  <sect2 role="seealso">
+    &reftitle.seealso;
+    <para>
+     <simplelist>
+      <member><function>is_callable</function></member>
+      <member><function>call_user_func</function></member>
+      <member><function>function_exists</function></member>
+      <member><link linkend="language.variables.variable">переменные переменные</link></member>
+     </simplelist>
+    </para>
+   </sect2>
  </sect1>

  <sect1 xml:id="functions.internal">
@@ -1398,12 +830,18 @@
     на него нельзя полагаться.
    </simpara>
   </note>
-  <para>
-   Ознакомьтесь также с описанием функции <function>function_exists</function>,
-   <link linkend="funcref">справочником функций</link> и функциями
-   <function>get_extension_funcs</function> и
-   <function>dl</function>.
-  </para>
+
+  <sect2 role="seealso">
+    &reftitle.seealso;
+    <para>
+     <simplelist>
+      <member><function>function_exists</function></member>
+      <member><link linkend="funcref">справочник функций</link></member>
+      <member><function>get_extension_funcs</function></member>
+      <member><function>dl</function></member>
+     </simplelist>
+    </para>
+   </sect2>
  </sect1>

  <sect1 xml:id="functions.anonymous">
@@ -1632,15 +1070,9 @@
 }
 ]]>
    </screen>
-   &example.outputs.53;
-   <screen>
-<![CDATA[
-Notice: Undefined variable: this in script.php on line 8
-NULL]]>
-   </screen>
   </example>
   <para>
-   Начиная с PHP 5.4.0, при объявлении в контексте класса, текущий
+   При объявлении в контексте класса, текущий
    класс будет автоматически связан с ним, делая <literal>$this</literal>
    доступным внутри функций класса. Если вы не хотите автоматического
    связывания с текущим классом, используйте <link
@@ -1650,7 +1082,7 @@
   <sect2 xml:id="functions.anonymous-functions.static">
    <title>Статические анонимные функции</title>
    <para>
-    Начиная с PHP 5.4, анонимные функции могут быть объявлены статически.
+    Анонимные функции могут быть объявлены статически.
     Это предотвратит их автоматическое связывание с текущим классом.
     Объекты также не будут с ними связаны во время выполнения.
    </para>
@@ -1731,18 +1163,6 @@
          и параметр.
         </entry>
        </row>
-       <row>
-        <entry>5.4.0</entry>
-        <entry>
-         Стало возможным использовать <varname>$this</varname>, а также объявлять статически.
-        </entry>
-       </row>
-       <row>
-        <entry>5.3.0</entry>
-        <entry>
-         Появление анонимных функций.
-        </entry>
-       </row>
       </tbody>
      </tgroup>
     </informaltable>
@@ -1763,36 +1183,36 @@
  </sect1>

  <sect1 xml:id="functions.arrow">
-   <title>Стрелочные функции</title>
-
-   <simpara>
-    Стрелочные функции появились в PHP 7.4, как более лаконичный синтаксис для <link linkend="functions.anonymous">анонимных функций</link>.
-   </simpara>
-   <simpara>
-    И анонимные, и стрелочные функции реализованы с использованием класса <link linkend="class.closure"><classname>Closure</classname></link>.
-   </simpara>
-
-   <simpara>
-    Основной вид записи стрелочных функций:
-    <code>fn (argument_list) =&gt; expr</code>.
-   </simpara>
-
-   <simpara>
-    Стрелочные функции поддерживают те же возможности, что и <link linkend="functions.anonymous">анонимные функции</link>,
-    за исключением того, что использование переменных из родительской области всегда выполняется автоматически.
-   </simpara>
-
-   <simpara>
-    Когда переменная, используемая в выражении, определена в родительской области,
-    она будет неявно захвачена по значению.
-    В следующем примере функции <varname>$fn1</varname> и
-    <varname>$fn2</varname> ведут себя одинаково.
-   </simpara>
-
-   <para>
-    <example>
-     <title>Стрелочные функции захватывают переменные по значению автоматически</title>
-     <programlisting role="php">
+  <title>Стрелочные функции</title>
+
+  <simpara>
+   Стрелочные функции появились в PHP 7.4, как более лаконичный синтаксис для <link linkend="functions.anonymous">анонимных функций</link>.
+  </simpara>
+  <simpara>
+   И анонимные, и стрелочные функции реализованы с использованием класса <link linkend="class.closure"><classname>Closure</classname></link>.
+  </simpara>
+
+  <simpara>
+   Основной вид записи стрелочных функций:
+   <code>fn (argument_list) =&gt; expr</code>.
+  </simpara>
+
+  <simpara>
+   Стрелочные функции поддерживают те же возможности, что и <link linkend="functions.anonymous">анонимные функции</link>,
+   за исключением того, что использование переменных из родительской области всегда выполняется автоматически.
+  </simpara>
+
+  <simpara>
+   Когда переменная, используемая в выражении, определена в родительской области,
+   она будет неявно захвачена по значению.
+   В следующем примере функции <varname>$fn1</varname> и
+   <varname>$fn2</varname> ведут себя одинаково.
+  </simpara>
+
+  <para>
+   <example>
+    <title>Стрелочные функции захватывают переменные по значению автоматически</title>
+    <programlisting role="php">
 <![CDATA[
 <?php

@@ -1813,16 +1233,16 @@
 <![CDATA[
 4
 ]]>
-      </screen>
+     </screen>
     </example>
-   </para>
-   <simpara>
-    Это также работает во вложенных стрелочных функций:
-   </simpara>
-   <para>
-    <example>
-     <title>Стрелочные функции захватывают переменные по значению автоматически, даже когда они вложены</title>
-     <programlisting role="php">
+  </para>
+  <simpara>
+   Это также работает во вложенных стрелочных функций:
+  </simpara>
+  <para>
+   <example>
+    <title>Стрелочные функции захватывают переменные по значению автоматически, даже когда они вложены</title>
+    <programlisting role="php">
 <![CDATA[
 <?php

@@ -1834,18 +1254,18 @@
 ]]>
      </programlisting>
     </example>
-   </para>
-   <simpara>
-    Подобно анонимным функциям,
-    синтаксис стрелочных функций допускает произвольные сигнатуры функций,
-    включая типы параметров и возвращаемых значений, значения по умолчанию, переменные,
-    а также передачу и возврат по ссылке.
-    Ниже приведены корректные примеры стрелочных функций:
-   </simpara>
-   <para>
-    <example>
-     <title>Примеры использования стрелочных функций</title>
-     <programlisting role="php">
+  </para>
+  <simpara>
+   Подобно анонимным функциям,
+   синтаксис стрелочных функций допускает произвольные сигнатуры функций,
+   включая типы параметров и возвращаемых значений, значения по умолчанию, переменные,
+   а также передачу и возврат по ссылке.
+   Ниже приведены корректные примеры стрелочных функций:
+  </simpara>
+  <para>
+   <example>
+    <title>Примеры использования стрелочных функций</title>
+    <programlisting role="php">
 <![CDATA[
 <?php

@@ -1860,20 +1280,20 @@
 ]]>
      </programlisting>
     </example>
-   </para>
-   <simpara>
-    Стрелочные функции используют привязку переменных по значению.
-    Это примерно эквивалентно выполнению <code>use($x)</code> для каждой
-    переменной <varname>$x</varname>, используемой внутри стрелочной функции.
-    Привязка по значению означает, что невозможно изменить какие-либо значения
-    из внешней области.
-    Вместо этого можно использовать <link linkend="functions.anonymous">анонимные функции</link>
-    для привязок по ссылкам.
-   </simpara>
-   <para>
-    <example>
-     <title>Значения из внешней области видимости не могут быть изменены стрелочными функциями</title>
-     <programlisting role="php">
+  </para>
+  <simpara>
+   Стрелочные функции используют привязку переменных по значению.
+   Это примерно эквивалентно выполнению <code>use($x)</code> для каждой
+   переменной <varname>$x</varname>, используемой внутри стрелочной функции.
+   Привязка по значению означает, что невозможно изменить какие-либо значения
+   из внешней области.
+   Вместо этого можно использовать <link linkend="functions.anonymous">анонимные функции</link>
+   для привязок по ссылкам.
+  </simpara>
+  <para>
+   <example>
+    <title>Значения из внешней области видимости не могут быть изменены стрелочными функциями</title>
+    <programlisting role="php">
 <![CDATA[
 <?php

@@ -1886,43 +1306,43 @@
 ]]>
      </programlisting>
     </example>
+  </para>
+
+  <sect2 role="changelog">
+   &reftitle.changelog;
+   <para>
+    <informaltable>
+     <tgroup cols="2">
+      <thead>
+       <row>
+        <entry>&Version;</entry>
+        <entry>&Description;</entry>
+       </row>
+      </thead>
+      <tbody>
+       <row>
+        <entry>7.4.0</entry>
+        <entry>
+         Стали доступны стрелочные функции.
+        </entry>
+       </row>
+      </tbody>
+     </tgroup>
+    </informaltable>
    </para>
-
-   <sect2 role="changelog">
-    &reftitle.changelog;
-    <para>
-     <informaltable>
-      <tgroup cols="2">
-       <thead>
-        <row>
-         <entry>&Version;</entry>
-         <entry>&Description;</entry>
-        </row>
-       </thead>
-       <tbody>
-        <row>
-         <entry>7.4.0</entry>
-         <entry>
-          Стали доступны стрелочные функции.
-         </entry>
-        </row>
-       </tbody>
-      </tgroup>
-     </informaltable>
-    </para>
-   </sect2>
-
-   <sect2 role="notes">
-    &reftitle.notes;
-    <note>
-     <simpara>
-      Можно использовать <function>func_num_args</function>,
-      <function>func_get_arg</function> и <function>func_get_args</function>
-      в стрелочной функции.
-     </simpara>
-    </note>
-   </sect2>
-  </sect1>
+  </sect2>
+
+  <sect2 role="notes">
+   &reftitle.notes;
+   <note>
+    <simpara>
+     Можно использовать <function>func_num_args</function>,
+     <function>func_get_arg</function> и <function>func_get_args</function>
+     в стрелочной функции.
+    </simpara>
+   </note>
+  </sect2>
+ </sect1>

 </chapter>