Ключевое слово final

PHP предоставляет ключевое слово final, разместив которое перед объявлениями методов или констант класса, можно предотвратить их переопределение в дочерних классах. Если же сам класс определяется с этим ключевым словом, то он не сможет быть унаследован.

Пример #1 Пример окончательных (final) методов

<?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()
// (Окончательный (final) метод BaseClass::moreТesting() не может быть переопределён)
?>

Пример #2 Пример окончательного (final) класса

<?php
final class BaseClass {
public function
test() {
echo
"Вызван метод BaseClass::test()\n";
}

// Поскольку класс уже является final, ключевое слово final является избыточным
final public function moreTesting() {
echo
"BaseClass::moreTesting() called\n";
}
}

class
ChildClass extends BaseClass {
}
// Выполнение заканчивается фатальной ошибкой: Class ChildClass may not inherit from final class (BaseClass)
// (Класс ChildClass не может быть унаследован от окончательного класса (BaseClass))
?>

Пример #3 Пример окончательной (final) константы класса, начиная с PHP 8.1.0

<?php
class Foo
{
final public const
X = "foo";
}

class
Bar extends Foo
{
public const
X = "bar";
}

// Ошибка: Bar::X не может переопределить окончательную константу Foo::X
?>

Замечание: Свойства не могут быть объявлены окончательными: только классы, методы и константы (начиная с PHP 8.1.0) могут быть объявлены как окончательные (final). Начиная с PHP 8.0.0, закрытые методы не могут быть объявлены окончательными, за исключением конструктора.