A palavra-chave final, previne que classes filhas sobrescrevam uma definição prefixada com final
. Se a própria classe estiver definida como final, ela não pode ser estendida.
Exemplo #1 Exemplo de métodos final
<?php
class ClasseBase {
public function teste() {
echo "ClasseBase::teste() chamado\n";
}
final public function maisTeste() {
echo "ClasseBase::maisTeste() chamado\n";
}
}
class ClasseFilha extends ClasseBase {
public function maisTeste() {
echo "ClasseFilha::maisTeste() called\n";
}
}
// Resulta em erro Fatal: Não pode sobrescrever método final ClasseBase::maisTeste()
?>
Exemplo #2 Exemplo de classe Final
<?php
final class ClasseBase {
public function teste() {
echo "Método ClasseBase::teste() chamado\n";
}
// A classe já foi marcada como final, esse final aqui é rendundante.
final public function maisTeste() {
echo "Método ClasseBase::maisTeste() chamado\n";
}
}
class ClasseFilha extends ClasseBase {
}
// Resulta em erro Fatal: Class ClasseFilha may not inherit from final class (ClasseBase)
?>
Exemplo #3 Exemplo de constantes finais (PHP 8.1.0 em diante)
<?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
?>
Nota: Propriedades não podem ser declaradas finais: somente classes, métodos e constantes (a partir do PHP 8.1.0). A partir do PHP 8.0.0, métodos privados não podem ser declarados privados, com exceção do construtor.