Final-Schlüsselwort

Das Schlüsselwort final hält Kindklassen davon ab, Methoden, Eigenschaften oder Konstanten zu überschreiben, indem man der Definition final voranstellt. Wenn die Klasse selbst als final definiert wird, kann sie nicht erweitert werden.

Beispiel #1 Beispiel für finale Methoden

<?php
class BaseClass {
public function
test() {
echo
"BaseClass::test() aufgerufen\n";
}

final public function
moreTesting() {
echo
"BaseClass::moreTesting() aufgerufen\n";
}
}

class
ChildClass extends BaseClass {
public function
moreTesting() {
echo
"ChildClass::moreTesting() aufgerufen\n";
}
}
// Erzeugt einen fatalen Fehler: Cannot override final method BaseClass::moreTesting()
?>

Beispiel #2 Beispiel für finale Klassen

<?php
final class BaseClass {
public function
test() {
echo
"BaseClass::test() aufgerufen\n";
}

// Da die Klasse bereits final ist, ist das Schlüsselwort final redundant
final public function moreTesting() {
echo
"BaseClass::moreTesting() aufgerufen\n";
}
}

class
ChildClass extends BaseClass {
}
// Erzeugt einen fatalen Fehler: Class ChildClass may not inherit from final class (BaseClass)
?>

Beispiel #3 Beispiel für finale Eigenschaften (seit PHP 8.4.0)

<?php
class BaseClass {
final protected
string $test;
}

class
ChildClass extends BaseClass {
public
string $test;
}
// Erzeugt einen fatalen Fehler: Cannot override final property BaseClass::$test
?>

Beispiel #4 Beispiel für finale Konstanten (seit 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
?>

Hinweis: Seit PHP 8.0.0 dürfen private Methoden nicht mehr als final deklariert werden. Ausgenommen davon ist der Konstruktor.

Hinweis: Eine als private(set) deklarierte Eigenschaft ist implizit final.