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 - V6Car 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.
Görev
KolayKalı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 birDevicesı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
privateyöntemi olangetManufacturingCode()ekle."Model: [modelNumber]"değerini döndüren birpublicyöntemi olangetModelInfo()ekle. Son olarak"[brand]-[manufacturingCode]"değerini döndüren birpublicyöntemi olangetFullCode()ekle. Bu, sınıfın kendi private üyelerine nasıl erişebildiğini gösterir.- Üretici adı için bir
Smartphone.php:Devicesınıfını genişleten birSmartphonesı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 olangetDeviceDetails()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 publicgetFullCode()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 birSmartphoneö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
?>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