Ключевое слово 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.