#1 PHP’de Final Sınıflar ve Readonly Sınıflar: Final Class

RMAG news

Final Sınıflar Nedir?

Final sınıflar, başka bir sınıf tarafından kalıtılamayan (inheritance) sınıflardır. Bir sınıfı final olarak tanımlamak, o sınıfın alt sınıflarının oluşturulmasını engeller. PHP’de bir sınıfı final anahtar kelimesiyle tanımlayarak bu sınırlamayı getirebilirsiniz.

Final Sınıf Tanımlaması

Final sınıflar şu şekilde tanımlanır:

<?php
final class FinalClass {
public function sayHello() {
echo “Hello from FinalClass!”;
}
}

// Hata: FinalClass’tan türetilemez
class AnotherClass extends FinalClass {
}

$finalClass = new FinalClass();
$finalClass->sayHello(); // “Hello from FinalClass!”
?>

Neden Final Sınıflara İhtiyaç Duyarız?

Tasarımın Korunması: Final sınıflar, bir sınıfın tasarımının korunmasını sağlar. Sınıfın davranışının değiştirilmesini veya genişletilmesini istemediğiniz durumlarda kullanılır.

Güvenlik: Özellikle güvenlik açısından kritik sınıfların veya hassas işlevlerin değiştirilememesi gerektiğinde kullanılır.

Performans: PHP’de final sınıflar, JVM (Java Virtual Machine) gibi dillerde olduğu kadar belirgin olmasa da, performans iyileştirmeleri sağlayabilir. Derleyici, final sınıfların kalıtılmayacağını bilerek optimizasyon yapabilir.

Örnek Kullanım Senaryoları

Utility Sınıflar: Helper veya utility fonksiyonları içeren sınıflar genellikle final olarak tanımlanır çünkü bu sınıfların kalıtılması genellikle mantıklı değildir.

Singleton Deseni: Singleton tasarım deseninde kullanılan sınıfın yalnızca bir kez örneklenmesini ve kalıtılmasını önlemek için final olarak tanımlanır.

Güvenlik Katmanları: Belirli bir güvenlik politikası uygulayan sınıflar, bu politikaların değiştirilememesi için final olarak tanımlanabilir.

Final Metotlar

Ayrıca, sınıfın kendisi olmasa da, belirli metotları final olarak tanımlayabilirsiniz. Bu, metodun alt sınıflar tarafından geçersiz kılınmasını (override) engeller.

<?php
class BaseClass {
public final function sayHello() {
echo “Hello from BaseClass!”;
}
}

class DerivedClass extends BaseClass {
// Hata: final method BaseClass::sayHello cannot be overridden
public function sayHello() {
echo “Hello from DerivedClass!”;
}
}

$baseClass = new BaseClass();
$baseClass->sayHello(); // “Hello from BaseClass!”
?>