Ключевое слово final
, которое указали перед определением метода,
свойства или константы, не разрешает дочерним классам переопределять
метод, свойство или константу.
Ключевое слово не разрешит расширить класс, если класс определили окончательным.
Пример #1 Пример окончательных методов
<?php
class BaseClass
{
public function test()
{
echo "Вызван метод BaseClass::test()\n";
}
final public function moreTesting()
{
echo "Вызван метод BaseClass::moreTesting()\n";
}
}
class ChildClass extends BaseClass
{
public function moreTesting()
{
echo "Вызван метод ChildClass::moreTesting()\n";
}
}
// Переопределение финального метода вызовет ошибку Fatal error: Cannot override final method BaseClass::moreTesting()
?>
Пример #2 Пример окончательного класса
<?php
final class BaseClass
{
public function test()
{
echo "Вызвали метод BaseClass::test()\n";
}
// Поскольку класс уже окончательный, ключевое слово final избыточно
final public function moreTesting()
{
echo "Вызвали метод BaseClass::moreTesting()\n";
}
}
class ChildClass extends BaseClass {}
// Наследование финального класса вызовет ошибку Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>
Пример #3 Пример финального свойства, которые появились с PHP 8.4.0
<?php
class BaseClass
{
final protected string $test;
}
class ChildClass extends BaseClass
{
public string $test;
}
// Переопределение финального свойства вызовет ошибку Fatal error: Cannot override final property BaseClass::$test
?>
Пример #4 Пример финальной константы, которые появились с PHP 8.1.0
<?php
class Foo
{
final public const X = "foo";
}
class Bar extends Foo
{
public const X = "bar";
}
// Переопределение финальной константы вызовет ошибку Fatal error: Bar::X cannot override final constant Foo::X
?>
Замечание: С PHP 8.0.0 закрытые методы, за исключением конструкторов , нельзя объявлять финальными.
Замечание: Свойства, которые объявили c закрытой видимостью области установки значения
private(set)
, неявно получают ключевое словоfinal
.