Sınıf tanımındaki "final" anahtar sözcüğü böyle bir sınıfın genişletilmesini engeller. Başka bir deyişle, final sınıfını ebeveyn olarak kullanamazsınız. Denerseniz, PHP ayrıştırıcısı bir hata verir.
PHP:
<?php
final class myclass {
/* class body */
}
class newclass extends myclass {
/* class body */
}
?>
Bu kodu çalıştırdığınızda bir hata gösterecektir:
PHP Fatal error: Class newclass may not inherit from final class (myclass)
Bir yöntem tanımının önüne final anahtar sözcüğünü eklemek, bir alt sınıfta geçersiz kılınmasını önler. Final yöntemi olan bir sınıf genişletilebilir, ancak alt sınıf onu geçersiz kılamaz.
Örnek
Aşağıdaki örneğe bir göz atın.
PHP:
<?php
class myclass {
final public function hello() {
echo "Hello World!";
}
}
class newclass extends myclass {
public function hello() {
echo "Hello PHP!";
}
}
?>
Bu kodu çalıştırdığınızda bir hata gösterecektir:
PHP Fatal error: Cannot override final method myclass::hello() in hello.php
Üst sınıftaki son sabiti alt sınıfta geçersiz kılmaya çalışırsanız bir hatayla karşılaşılır.
PHP:
<?php
class myclass {
final public const NAME = "My Class";
final public function hello() {
echo "Hello World!";
}
}
class newclass extends myclass {
public const NAME = "New Class";
}
?>
Bu kodu çalıştırdığınızda bir hata gösterecektir:
Fatal error: newclass::NAME cannot override final constant myclass::NAME
Aşağıdaki PHP betiği, bir PI sabiti ve her ikisi de final olarak bildirilen area() metoduna sahip bir ebeveyn sınıfı olan ellipse içerir. Bunlar circle sınıfı tarafından miras alınır. area() fonksiyonu circle'ın alanını hesaplar.
PHP:
<?php
class ellipse {
final public const PI=22/7;
private float $a, $b;
public function __construct($x, $y) {
$this->a = $x;
$this->b = $y;
}
final public function area() : float {
return self::PI*$this->a*$this->b;
}
}
class circle extends ellipse {
public function __construct(float $x) {
parent::__construct($x, $x);
}
}
$c1 = new circle(5);
echo "Area: " . $c1->area() . PHP_EOL;
?>