11<?xml version =" 1.0" encoding =" utf-8" ?>
2- <!-- EN-Revision: 5e8652131e898cd3d02cd26eeb26da718a6aaf65 Maintainer: shein Status: ready -->
2+ <!-- EN-Revision: 16f66c05a4060a7d673ae1c70b656d65009407b0 Maintainer: shein Status: ready -->
33<!-- Reviewed: no -->
44<sect1 xml : id =" language.oop5.final" xmlns =" http://docbook.org/ns/docbook" >
55 <title >Ключевое слово final</title >
66 <para >
7- Ключевое слово <literal >final</literal >, которое указали перед определением метода или константы,
8- не даёт дочерним классам переопределять этот метод или константу.
9- Ключевое слово не даст расширить класс, если класс определили окончательным.
7+ Ключевое слово <literal >final</literal >, которое указали перед определением метода,
8+ свойства или константы, не разрешает дочерним классам переопределять
9+ метод, свойство или константу.
10+ Ключевое слово не разрешит расширить класс, если класс определили окончательным.
1011 </para >
1112 <para >
1213 <example >
@@ -35,7 +36,7 @@ class ChildClass extends BaseClass
3536 echo "Вызван метод ChildClass::moreTesting()\n";
3637 }
3738}
38- // Приводит к фатальной ошибке : Cannot override final method BaseClass::moreTesting()
39+ // Переопределение финального метода вызовет ошибку Fatal error : Cannot override final method BaseClass::moreTesting()
3940
4041?>
4142]]>
@@ -51,30 +52,51 @@ class ChildClass extends BaseClass
5152
5253final class BaseClass
5354{
54- public function test()
55- {
56- echo "Вызван метод BaseClass::test()\n";
57- }
55+ public function test()
56+ {
57+ echo "Вызвали метод BaseClass::test()\n";
58+ }
5859
59- // Поскольку класс уже окончательный, ключевое слово final избыточно
60- final public function moreTesting()
61- {
62- echo "Вызван метод BaseClass::moreTesting()\n";
63- }
60+ // Поскольку класс уже окончательный, ключевое слово final избыточно
61+ final public function moreTesting()
62+ {
63+ echo "Вызвали метод BaseClass::moreTesting()\n";
64+ }
6465}
6566
6667class ChildClass extends BaseClass {}
67- // Приводит к фатальной ошибке : Class ChildClass may not inherit from final class (BaseClass)
68+ // Наследование финального класса вызовет ошибку Fatal error : Class ChildClass may not inherit from final class (BaseClass)
6869
6970?>
7071]]>
7172 </programlisting >
7273 </example >
7374 </para >
74- <para >
75- <example xml : id =" language.oop5.final.example.php81" >
76- <title >Пример окончательной константы, которые появились в PHP 8.1.0</title >
77- <programlisting role =" php" >
75+ <example >
76+ <title >Пример финального свойства, которые появились с PHP 8.4.0</title >
77+ <programlisting role =" php" >
78+ <![CDATA[
79+ <?php
80+
81+ class BaseClass
82+ {
83+ final protected string $test;
84+ }
85+
86+ class ChildClass extends BaseClass
87+ {
88+ public string $test;
89+ }
90+
91+ // Переопределение финального свойства вызовет ошибку Fatal error: Cannot override final property BaseClass::$test
92+
93+ ?>
94+ ]]>
95+ </programlisting >
96+ </example >
97+ <example xml : id =" language.oop5.final.example.php81" >
98+ <title >Пример финальной константы, которые появились с PHP 8.1.0</title >
99+ <programlisting role =" php" >
78100<![CDATA[
79101<?php
80102
@@ -88,20 +110,25 @@ class Bar extends Foo
88110 public const X = "bar";
89111}
90112
91- // Фатальная ошибка : Bar::X cannot override final constant Foo::X
113+ // Переопределение финальной константы вызовет ошибку Fatal error : Bar::X cannot override final constant Foo::X
92114
93115?>
94116]]>
95- </programlisting >
96- </example >
97- </ para >
117+ </programlisting >
118+ </example >
119+
98120 <note >
99121 <simpara >
100- Свойства нельзя объявлять окончательными: только классы, методы и константы (с PHP 8.1.0)
101- разрешено объявлять окончательными.
122+ С PHP 8.0.0 закрытые методы, за исключением <link linkend =" language.oop5.decon.constructor" >
123+ конструкторов
124+ </link >, нельзя объявлять финальными.
102125 </simpara >
126+ </note >
127+ <note >
103128 <simpara >
104- С PHP 8.0.0 закрытые методы, кроме конструктора, нельзя объявлять окончательными.
129+ Свойства, которые объявили c закрытой областью установки видимости
130+ <link linkend =" language.oop5.visibility-members-aviz" ><literal >private(set)</literal ></link >,
131+ неявно получают ключевое слово <literal >final</literal >.
105132 </simpara >
106133 </note >
107134</sect1 >
0 commit comments