Menu
Coddy logo textTech

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-1

getAccountId() 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 admin

Hiç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.

challenge icon

Görev

Kolay

Alt 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 bir Document sı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ı bir final yö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 bir getContent() yöntemi de ekle.
  • Report.php: Document sınıfını genişleten bir Report sı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çin parent::__construct() kullan, ardından departmanı ayarla. getContent() yöntemini "Report: [title] ([department])" döndürecek şekilde geçersiz kıl. Report sınıfı, değiştiremeden final getSignature() 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 bir Report nesnesi oluştur. İlk satırda getContent() sonucunu, ardından ikinci satırda getSignature() 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
?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi