Menu
Coddy logo textTech

Erişim Belirleyicilere Derinlemesine Bakış

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

Üç erişim belirleyicisini anladığınıza göre, bunların kalıtım senaryolarında nasıl davrandığını inceleyelim. Temel çıkarım, protected üyelerin alt sınıflar için erişilebilir hale gelmesi, private üyelerin ise çocuklardan bile gizli kalmaya devam etmesidir.

<?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 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 (public) değişkenine erişebilir ve getEngineInfo() (protected) metodunu çağırabilir, ancak Vehicle sınıfına özel (private) oldukları için $serialNumber veya getSerial() öğelerine erişimi yoktur. Bu ayrım, bazı dahili detayları alt sınıflarla paylaşmanıza olanak tanırken diğerlerini tamamen gizli tutmanızı sağlar.

Önemli Nokta: Alt sınıfların dahili verilere veya yöntemlere erişmesi gerektiğinde protected, alt sınıfların bile belirli uygulama detaylarına dokunmaması gerektiğinde ise private kullanın.

challenge icon

Görev

Kolay

Erişim belirleyicilerinin kalıtım boyunca nasıl davrandığını keşfeden bir cihaz yönetim sistemi oluşturalım. Farklı görünürlük seviyelerinde özelliklere sahip bir temel Device sınıfı oluşturacak, ardından çocuk sınıfların hangi üyelere erişip erişemeyeceğini gösteren bir Smartphone sınıfı ile bunu genişleteceksiniz.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • Device.php — Değişen veri hassasiyeti seviyelerine sahip elektronik cihazları temsil eden bir Device sınıfı oluşturun. Şunları içermelidir:
    • Üretici adı için public bir özellik: $brand
    • Dahili tanımlama için protected bir özellik: $modelNumber
    • Yalnızca fabrika verileri için private bir özellik: $manufacturingCode
    Yapıcı (constructor) her üç değeri de kabul etmelidir. Üretim kodunu döndüren private bir metot olan getManufacturingCode() ekleyin. "Model: [modelNumber]" döndüren public bir metot olan getModelInfo() ekleyin. Son olarak, "[brand]-[manufacturingCode]" döndüren public bir metot olan getFullCode() ekleyin — bu, sınıfın kendi özel (private) üyelerine nasıl erişebildiğini gösterir.
  • Smartphone.phpDevice sınıfını genişleten bir Smartphone sınıfı oluşturun. Device dosyasını dahil edin. Yapıcı; brand, modelNumber, manufacturingCode ve bir işletim sistemi adını kabul etmelidir. İlk üç değerle üst sınıf yapıcısını (parent constructor) çağırın, ardından işletim sistemini (OS) özel bir özellikte saklayın. "[brand] [modelNumber] running [os]" döndüren public bir metot olan getDeviceDetails() ekleyin. Public olan $brand özelliğine doğrudan ve protected olan $modelNumber özelliğine nasıl erişebildiğinize, ancak private olan $manufacturingCode özelliğine doğrudan erişemediğinize dikkat edin — bunun yerine kalıtımla alınan public getFullCode() metodunu kullanmanız gerekecektir.
  • main.php — Smartphone dosyasını dahil edin. Dört girdi alacaksınız: bir marka adı, bir model numarası, bir üretim kodu ve bir işletim sistemi. Bu değerlerle bir Smartphone örneği oluşturun. Üç satır yazdırın:
    • getDeviceDetails() çağrısının sonucu
    • Kalıtımla alınan getModelInfo() metodunun çağrılmasının sonucu
    • Kalıtımla alınan getFullCode() metodunun çağrılmasının sonucu

Bu meydan okuma temel ayrımı vurgular: Smartphone sınıfınız Device sınıfından miras alınan protected $modelNumber özelliğini özgürce kullanabilir, ancak private $manufacturingCode ve getManufacturingCode() tamamen gizli kalır — bunlara yalnızca Device sınıfının dışarıya açmayı seçtiği public arayüz aracılığıyla erişilebilir.

Kopya kağıdı

Kalıtımda, protected üyeler alt sınıflar tarafından erişilebilirdir, private üyeler ise alt sınıflardan bile gizli kalı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() da başarısız olur - private metot!
    }
}

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

Alt sınıflar şunlara erişebilir:

  • public özellikler ve metotlar
  • protected özellikler ve metotlar

Alt sınıflar şunlara erişemez:

  • private özellikler ve metotlar (bunlar üst sınıfa özel kalır)

En İyi Uygulama: Alt sınıfların dahili verilere veya metotlara erişmesi gerektiğinde protected, alt sınıfların bile belirli uygulama detaylarına dokunmaması gerektiğinde private kullanın.

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));

// YAPILACAK: Giriş değerleri ile bir Smartphone örneği oluşturun

// YAPILACAK: getDeviceDetails() sonucunu yazdırın

// YAPILACAK: Kalıtım alınan getModelInfo() metodunun sonucunu yazdırın

// YAPILACAK: Kalıtım alınan getFullCode() metodunun sonucunu yazdırın
?>
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