Ключевое слово 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";
}
}
// Приводит к фатальной ошибке: 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 {}
// Приводит к фатальной ошибке: Class ChildClass may not inherit from final class (BaseClass)
?>
Пример #3 Пример окончательной константы, которые появились в PHP 8.1.0
<?php
class Foo
{
final public const X = "foo";
}
class Bar extends Foo
{
public const X = "bar";
}
// Фатальная ошибка: Bar::X cannot override final constant Foo::X
?>
Замечание: Свойства нельзя объявлять окончательными: только классы, методы и константы (с PHP 8.1.0) разрешено объявлять окончательными. С PHP 8.0.0 закрытые методы, кроме конструктора, нельзя объявлять окончательными.