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

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