PHP 8.3 ile gelen readonly sınıflar, durum bütünlüğünü güçlendirirken miras ilişkilerinde sizden daha dikkatli bir tasarım bekler. Bu makalede, readonly sınıflar ile kalıtım arasındaki çatışmaları ileri düzeyde teşhis etmek, hataları güvenli şekilde çözmek ve üretim kod tabanında sağlam tasarım desenleri uygulamak için uygulanabilir adımları ele alıyoruz.
Kalıtım üzerinde readonly sınıfların etkisini anlamak
– Readonly sınıflar, özelliklerin değeri yalnızca kurucu içinde atanabilir ve sonrasında değiştirilemez. Bu durum, üst sınıfta belirli bir başlangıç durumunun garantili kalmasını sağlar. Ancak alt sınıflar, miras alınan readonly özelliklere erişim ve atama konusunda sınırlamaları göz önünde bulundurmazsa hatalar kaçınılmaz olur.
– Özellikle alt sınıf, üst sınıfın readonly özelliğini farklı bir bağlamda değiştirmeye çalışırsa “Cannot modify readonly property” hatası alırsınız. Bu, kurucu aşamasında atanan değerlerin ötesinde bir davranış değişikliği dâhilinde ortaya çıkar.
Güçlü teşhis stratejileri
– Hiyerarşi haritası çıkarın: Üst sınıfta hangi özelliklerin readonly olduğunu ve hangi noktaların kurucu dışında atama yapılabildiğini netleştirin. Alt sınıflarda hangi alanlar üzerinde yazma girişimi olduğunu belirleyin.
– Sözleşme uyumu kontrolü: Üst sınıf readonly ise alt sınıfı bu sözleşmeye uygun şekilde tasarlamak gerekir. Alt sınıfın kurucusu, üst sınıfın kurucusunu doğru çağırmalı ve readonly alanları değiştirmemelidir.
– Statik analiz kullanımı: Psalm, PHPStan gibi araçlarda “cannot reassign readonly property” veya “cannot override readonly property” gibi uyarıları mutlaka yakalayın. Kurulumda bu kontroller CI sürecine entegre edin.
– Derinlemesine testler: Aşırıya kaçmadan alt sınıf için ayrı test senaryoları oluşturun. Özellikle kurucu içinde atama noktalarını ve nesne durumunun değişmediğini doğrulayın.
Tasarımsal çözümler ve güvenli kalıtım pratikleri
– Composition tercih edin: Kalıtım yerine “davranışlar”ı bir bileşen olarak birleştirmek, üst sınıfın readonly davranışını bozmadan genişletmeye olanak tanır. Alt sınıf, davranışları enjekte edilen bileşenlerle yönetsin.
– Araya soyut katmanlar ekleyin: Üst sınıf ile alt sınıf arasına arayüz/soyut sınıf koyarak değişen davranışları soyutlaştırın ve satır aralığında hata riskini azaltın.
– Readonly sınıfı final yapma: Eğer miras alınması güvenli değilse, sınıfı final olarak işaret edin. Böylece istenmeyen kalıtım engellenir ve talimatlar netleşir.
– Alt sınıf üzerinden hesaplanan değerler: readonly özelliğin değeri kurucu içinde atanıyorsa, alt sınıfın kurucusundaki atama yerine hesaplanan değerleri yeni alanlar üzerinden sunun.
Uygulama örnekleri: güvenli yapılandırma desenleri
– Desen 1: Composition ile davranış yönlendirme
Aşağıdaki örnekte üst sınıf, yalnızca konum değerlerini taşıyan bir durum kapsayıcısıdır. Alt sınıf, davranışları bir bileşen üzerinden yürütür:
PHP
class StateCarrier {
public function __construct(
protected string $state
) {}
public function getState(): string {
return $this->state;
}
}
class BehaviorComponent {
public function execute(string $state): void {
// davranışa göre işlem
echo “State: {$state}\n”;
}
}
class Derived extends StateCarrier {
private BehaviorComponent $behavior;
public function __construct(string $state, BehaviorComponent $behavior) {
parent::__construct($state);
$this->behavior = $behavior;
}
public function run(): void {
$this->behavior->execute($this->getState());
}
}
– Desen 2: Üst sınıf readonly, alt sınıf bağımsız sorumluluk
PHP
final class ReadonlyBase {
public function __construct(
protected readonly string $id
) {}
public function getId(): string {
return $this->id;
}
}
class Derived extends ReadonlyBase {
private string $extra;
public function __construct(string $id, string $extra) {
parent::__construct($id);
$this->extra = $extra;
}
public function describe(): string {
return “ID: {$this->getId()} – Extra: {$this->extra}”;
}
}
– Hata odaklı tetikleyici senaryo
PHP
class SuperReadonly {
public function __construct(protected readonly int $version) {}
}
class Sub extends SuperReadonly {
public function bump(): void {
// Hatalı: readonly alan üzerinde yazmaya çalışır
$this->version = $this->version + 1;
}
}
Bu durumda derleyici veya PHP çalıştırması şu hatayı verir: Cannot modify readonly property Sub::$version.
Hata çözümleri ve hareket planı
– Alt sınıfta readonly özelliği değiştirme girişimini kaldırın. Değeri hesaplamak için yeni alanlar veya yöntemler kullanın.
– Üst sınıfın kurucusunu doğru çağırdığınızdan emin olun; aşırı atama veya yeniden tanımlamadan kaçının.
– Gerekirse üst sınıfı final yapın veya alt sınıfı bağımsız bir işlevselliğe taşıyın.
n8n entegrasyonu için JSON tabanlı doğrulama noktaları
– Hataları CI/CD içinde test etmek için şu örnek JSON ile statik/dinamik kontroller ekleyin:
{
“scenario”: “readonly_inheritance_validation”,
“classes”: {
“Parent”: {“readonly”: true, “properties”: [“id”]},
“Child”: {“extends”: “Parent”, “properties”: [“version”]}
},
“expected”: {
“error”: “Cannot modify readonly property Child::$id”
}
}
Bu yapı, tasarım hatalarını erken aşamada yakalamak ve hangi alanın sorun çıkardığını göstermek için bir referans sağlar.
Sonuç ve öneriler
Readonly sınıflar, durum bütünlüğünü güçlendirirken kalıtım katmanında kırılganlıklar doğurabilir. Özellikle üst sınıfın readonly davranışını değiştirmeden alt sınıflarda yeni sorumluluklar getirmenin güvenli yollarını tercih etmek gerekir. Composition, arayüz soyutlaması ve final sınıf tercihleri ile miras problemlerinin etkisini minimize edin. Üretim kod tabanında bu prensiplere sadık kaldığınızda, refactoring sonrası bakım maliyeti azalır ve hataların geri dönüşü kolaylaşır.
Bu yazıyı beğendiyseniz, sosyal medya hesaplarınızda paylaşarak daha fazla kişiye ulaşmasını sağlayabilirsiniz. 😊
Ayrıca bizi sosyal medyada da takip edebilirsiniz;
Instagram: @lupusoft
Facebook: @lupusoft
X: @lupusoft
LinkedIn: @lupusoft
Current time (ISO): 2026-04-04T10:00:31.957+03:00
Bir yanıt yazın