final Anahtar Sözcüğü
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 24 / 91.
Kalıtım ve metot geçersiz kılma esneklik sağlasa da bazen belirli sınıfların veya metotların değiştirilmesini önlemeniz gerekir. final anahtar kelimesi kodunuzu kilitleyerek belirli uygulamaların alt sınıflar tarafından değiştirilememesini sağlar.
Bir metodu final olarak işaretlediğinizde hiçbir alt sınıf onu geçersiz kılamaz:
<?php
class BankAccount {
protected $balance;
public function __construct($balance) {
$this->balance = $balance;
}
final public function getAccountId() {
return "ACC-" . spl_object_id($this);
}
}
class SavingsAccount extends BankAccount {
public function addInterest() {
return $this->balance * 0.05;
}
}
$account = new SavingsAccount(1000);
echo $account->getAccountId();
Çıktı:
ACC-1getAccountId() yöntemi SavingsAccount içinde veya başka herhangi bir alt sınıfta geçersiz kılınamaz. Bu, tüm hesap türlerinde tutarlı kalması gereken kritik işlevleri korur.
Kalıtımı önlemek için bir sınıfın tamamını final olarak da işaretleyebilirsin:
<?php
final class SecurityManager {
public function authenticate($user) {
return "Authenticating $user";
}
}
$security = new SecurityManager();
echo $security->authenticate("admin");
Çıktı:
Authenticating adminHiçbir sınıf SecurityManager sınıfını genişletemez. Bu, güvenliğe duyarlı sınıflar için veya sınıf tasarımı tamamlandığında ve değiştirilmemesi gerektiğinde kullanışlıdır.
Önemli Nokta: Kalıtıma izin vermeye devam ederken geçersiz kılmayı önlemek için yöntemlerde final kullanın veya kalıtımı tamamen önlemek için sınıflarda kullanın. Bu, tasarlandığı şekilde tam olarak çalışması gereken kritik kodu korumaya yarayan bir araçtır.
Görev
KolayAlt sınıfların kritik işlevleri değiştirmesini önleyen final anahtar sözcüğünün nasıl çalıştığını gösteren bir belge yönetim sistemi oluşturalım.
Belirli güvenlik özelliklerinin kilitli kalmasını sağlarken farklı belge türlerini yönetmek üzere birlikte çalışan üç dosya oluşturacaksın:
Document.php: Tüm belgeler için temel sınıf görevi gören birDocumentsınıfı tanımla. Bu sınıfın herkese açık bir$titleözelliği ve korumalı bir$authorözelliği olmalıdır. Yapıcı, hem başlığı hem de yazarı kabul eder."Signed by: [author]"döndüren,getSignature()adlı birfinalyöntemi ekle. Bu güvenlik özelliği alt sınıflar tarafından asla değiştirilememelidir. Ayrıca"Document: [title]"döndüren normal birgetContent()yöntemi de ekle.Report.php:Documentsınıfını genişleten birReportsınıfı tanımla. En üstte Document dosyasını dahil et. Bu sınıf bir$departmentözelliği ekler. Yapıcı başlık, yazar ve departmanı kabul etmelidir: ilk ikisi içinparent::__construct()kullan, ardından departmanı ayarla.getContent()yöntemini"Report: [title] ([department])"döndürecek şekilde geçersiz kıl.Reportsınıfı, değiştiremeden finalgetSignature()yöntemini devralır.main.php: Report dosyasını dahil et. Üç girdi alacaksın: belgenin başlığı, yazarın adı ve departman. Bu değerlerle birReportnesnesi oluştur. İlk satırdagetContent()sonucunu, ardından ikinci satırdagetSignature()sonucunu yazdır.
Bu görev, final yöntemlerinin kritik işlevleri nasıl koruduğunu gösterir: imza oluşturma tüm belge türlerinde tutarlı kalırken getContent() gibi diğer yöntemler her alt sınıf tarafından özelleştirilebilir. Report içeriğin nasıl görüntüleneceğini değiştirebilir, ancak imza biçimi üst sınıfta kilitlidir.
Kendin dene
<?php
require_once 'Report.php';
// Girdiyi oku
$title = trim(fgets(STDIN));
$author = trim(fgets(STDIN));
$department = trim(fgets(STDIN));
// TODO: Giriş değerleriyle bir Report nesnesi oluştur
// TODO: getContent() sonucunu yazdır
// TODO: getSignature() sonucunu yazdır
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi