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 - V6Car 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.
Görev
KolayEriş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 birDevicesınıfı oluşturun. Şunları içermelidir:- Üretici adı için
publicbir özellik:$brand - Dahili tanımlama için
protectedbir özellik:$modelNumber - Yalnızca fabrika verileri için
privatebir özellik:$manufacturingCode
privatebir metot olangetManufacturingCode()ekleyin."Model: [modelNumber]"döndürenpublicbir metot olangetModelInfo()ekleyin. Son olarak,"[brand]-[manufacturingCode]"döndürenpublicbir metot olangetFullCode()ekleyin — bu, sınıfın kendi özel (private) üyelerine nasıl erişebildiğini gösterir.- Üretici adı için
Smartphone.php—Devicesınıfını genişleten birSmartphonesı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 olangetDeviceDetails()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 publicgetFullCode()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 birSmartphoneö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 metotlarprotectedö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
?>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 KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarı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ıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi