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