Menu
Coddy logo textTech

Erişim Belirleyicileri Derinlemesine

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 39 / 91.

Artık üç erişim belirleyicisini anladığına göre, kalıtım senaryolarında nasıl davrandıklarını inceleyelim. Temel fikir, protected üyelerin alt sınıflar için erişilebilir hâle gelmesi, private üyelerin ise alt sınıflardan bile gizli kalmasıdır.

<?php
class Vehicle {
    public $brand;
    protected $engineType;
    private $serialNumber;
    
    public function __construct($brand, $engine, $serial) {
        $this->brand = $brand;
        $this->engineType = $engine;
        $this->serialNumber = $serial;
    }
    
    private function getSerial() {
        return $this->serialNumber;
    }
    
    protected function getEngineInfo() {
        return $this->engineType;
    }
}

class Car extends Vehicle {
    public function getDetails() {
        return $this->brand . " - " . $this->getEngineInfo();
        // $this->serialNumber bir hataya neden olur - private!
        // $this->getSerial() de başarısız olur - private method!
    }
}

$car = new Car("Toyota", "V6", "ABC123");
echo $car->getDetails();

Çıktı:

Toyota - V6

Car sınıfı $brand değişkenine (public) erişebilir ve getEngineInfo() metodunu (protected) çağırabilir; ancak $serialNumber değişkenine veya getSerial() metoduna erişemez, çünkü bunlar Vehicle sınıfına özeldir. Bu ayrım, bazı dahili ayrıntıları alt sınıflarla paylaşırken diğerlerini tamamen gizli tutmanızı sağlar.

Anahtar Nokta: Alt sınıfların dahili verilere veya yöntemlere erişmesi gerektiğinde protected kullanın; alt sınıfların bile belirli uygulama ayrıntılarına dokunmaması gerektiğinde ise private kullanın.

challenge icon

Görev

Kolay

Kalıtım genelinde erişim belirleyicilerinin nasıl davrandığını inceleyen bir cihaz yönetim sistemi oluşturalım. Farklı görünürlük düzeylerinde özelliklere sahip bir temel Device sınıfı oluşturacak, ardından bunu alt sınıfların hangi üyelere erişip hangilerine erişemediğini gösteren bir Smartphone sınıfıyla genişleteceksin.

Kodunu üç dosya arasında düzenleyeceksin:

  • Device.php: Farklı düzeylerde veri hassasiyetine sahip elektronik cihazları temsil eden bir Device sınıfı oluştur. Şunları ekle:
    • Üretici adı için bir public özelliği olan $brand
    • Dahili tanımlama için bir protected özelliği olan $modelNumber
    • Yalnızca fabrika verileri için bir private özelliği olan $manufacturingCode
    Yapıcı, bu üç değerin tamamını kabul etmelidir. Üretim kodunu döndüren bir private yöntemi olan getManufacturingCode() ekle. "Model: [modelNumber]" değerini döndüren bir public yöntemi olan getModelInfo() ekle. Son olarak "[brand]-[manufacturingCode]" değerini döndüren bir public yöntemi olan getFullCode() ekle. Bu, sınıfın kendi private üyelerine nasıl erişebildiğini gösterir.
  • Smartphone.php: Device sınıfını genişleten bir Smartphone sınıfı oluştur. Device dosyasını dahil et. Yapıcı; brand, modelNumber, manufacturingCode ve bir işletim sistemi adını kabul etmelidir. İlk üç değeri üst sınıfın yapıcısına aktar, ardından işletim sistemini private bir özellikte sakla. "[brand] [modelNumber] running [os]" değerini döndüren bir public yöntem olan getDeviceDetails() ekle. Public $brand özelliğine doğrudan ve protected $modelNumber özelliğine erişebildiğine, ancak private $manufacturingCode özelliğine doğrudan erişemediğine dikkat et: bunun yerine miras alınan public getFullCode() yöntemini kullanman gerekir.
  • main.php: Smartphone dosyasını dahil et. Dört girdi alacaksın: bir marka adı, bir model numarası, bir üretim kodu ve bir işletim sistemi. Bu değerlerle bir Smartphone örneği oluştur. Üç satır yazdır:
    • getDeviceDetails() çağrısının sonucu
    • Miras alınan getModelInfo() yönteminin çağrılmasının sonucu
    • Miras alınan getFullCode() yönteminin çağrılmasının sonucu

Bu görev, temel ayrımı vurgular: Smartphone sınıfın Device sınıfından miras aldığı protected $modelNumber özelliğini serbestçe kullanabilir, ancak private $manufacturingCode ve getManufacturingCode() tamamen gizli kalır: bunlara yalnızca Device sınıfının kullanıma sunduğu public arayüz üzerinden erişilebilir.

Kendin dene

<?php
require_once 'Smartphone.php';

// Girdileri oku
$brand = trim(fgets(STDIN));
$modelNumber = trim(fgets(STDIN));
$manufacturingCode = trim(fgets(STDIN));
$os = trim(fgets(STDIN));

// TODO: Girdi değerleriyle bir Smartphone örneği oluştur

// TODO: getDeviceDetails() sonucunu yazdır

// TODO: Miras alınan getModelInfo() metodunun sonucunu yazdır

// TODO: Miras alınan getFullCode() metodunun 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