Public, Protected, Private
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 38 / 91.
Kapsülleme (Encapsulation) bölümüne hoş geldiniz! Kapsülleme (Encapsulation), sınıfınızın dahili verilerine erişimi kontrol etmekle ilgilidir. PHP, özelliklere ve yöntemlere nereden erişilebileceğini belirleyen üç erişim belirleyicisi sağlar: public, protected ve private.
Her bir değiştiricinin nasıl çalıştığı aşağıda açıklanmıştır:
<?php
class BankAccount {
public $accountHolder; // Her yerden erişilebilir
protected $accountNumber; // Bu sınıftan ve alt sınıflardan erişilebilir
private $balance; // Sadece bu sınıftan erişilebilir
public function __construct($holder, $number, $balance) {
$this->accountHolder = $holder;
$this->accountNumber = $number;
$this->balance = $balance;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount("John", "12345", 1000);
echo $account->accountHolder . "\n"; // Çalışır - public
echo $account->getBalance(); // Çalışır - public metot
Çıktı:
John
1000$account->balance değerine doğrudan erişmeye çalışmak, private olduğu için bir hataya neden olur. Aynısı, sınıf hiyerarşisinin dışından $account->accountNumber için de geçerlidir. Bu koruma, hassas verilerin yalnızca kontrollü yöntemlerle değiştirilebilmesini sağlar.
| Erişim Belirleyici | Aynı Sınıf | Alt Sınıf | Dışarıdan |
|---|---|---|---|
public | Evet | Evet | Evet |
protected | Evet | Evet | Hayır |
private | Evet | Hayır | Hayır |
Anahtar Nokta: Doğrudan erişilmemesi gereken dahili veriler için private, alt sınıfların ihtiyaç duyduğu veriler için protected ve yalnızca güvenli harici erişim için public kullanın.
Görev
KolayErişim belirleyicilerinin hassas verileri nasıl koruduğunu gösteren güvenli bir çalışan yönetim sistemi oluşturalım. Kodun nerede çalıştığına bağlı olarak (sınıf içinde, bir alt sınıfta veya dışarıdan) farklı bilgi seviyelerine erişilebilen bir sınıf hiyerarşisi oluşturacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Employee.php— Çalışan verilerini uygun görünürlük seviyeleriyle yöneten birEmployeesınıfı oluşturun. Sınıf şunlara sahip olmalıdır:- Çalışanın adı için
publicbir özellik olan$name(herkesin görmesi güvenlidir) - Dahili kimlik için
protectedbir özellik olan$employeeId(alt sınıflar tarafından ihtiyaç duyulur) - Hassas maaş bilgileri için
privatebir özellik olan$salary(yalnızca bu sınıf doğrudan erişmelidir)
getSalary()ekleyin — bu, korunan verilere erişmenin kontrollü yoludur. Ayrıca"[name] works here"döndüren bir public metot olangetPublicInfo()ekleyin.- Çalışanın adı için
Manager.php—Employeesınıfını genişleten birManagersınıfı oluşturun. Employee dosyasını dahil edin. Yapıcı metot ad, employeeId, maaş ve bir departman adı kabul etmelidir. İlk üç değerle üst sınıfın yapıcısını çağırın, ardından departmanı özel bir özellikte saklayın."Manager [name] (ID: [employeeId]) leads [department]"döndüren bir public metot olangetTeamInfo()ekleyin. Alt sınıfın korumalı$employeeIdözelliğine nasıl erişebildiğine, ancak özel maaşa erişmek içingetSalary()metoduna ihtiyaç duyacağına dikkat edin.main.php— Manager dosyasını dahil edin. Dört girdi alacaksınız: bir ad, bir çalışan kimliği, bir maaş (tam sayıya dönüştüreceğiniz bir dize olarak) ve bir departman adı. Bu değerlerle birManagerörneği oluşturun. Üç satır yazdırın:- Doğrudan erişilen yöneticinin adı (public özellik)
getTeamInfo()çağrısının sonucugetSalary()çağrısının sonucu
Bu zorluk, kapsüllemeyi (encapsulation) iş başında gösterir: ad serbestçe erişilebilirdir, çalışan kimliği korumalı görünürlük yoluyla alt sınıflarla paylaşılır ve maaş, üst sınıfta kilitli kalır — yalnızca kontrollü bir public metot aracılığıyla erişilebilir.
Kopya kağıdı
PHP, özelliklere ve metotlara nereden erişilebileceğini kontrol etmek için üç adet erişim belirleyici (access modifier) sağlar:
| Belirleyici | Aynı Sınıf | Alt Sınıf | Dışarıdan |
|---|---|---|---|
public | Evet | Evet | Evet |
protected | Evet | Evet | Hayır |
private | Evet | Hayır | Hayır |
Örnek:
<?php
class BankAccount {
public $accountHolder; // Her yerden erişilebilir
protected $accountNumber; // Bu sınıftan ve alt sınıflardan erişilebilir
private $balance; // Sadece bu sınıf içinden erişilebilir
public function __construct($holder, $number, $balance) {
$this->accountHolder = $holder;
$this->accountNumber = $number;
$this->balance = $balance;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount("John", "12345", 1000);
echo $account->accountHolder; // Çalışır - public
echo $account->getBalance(); // Çalışır - public metot
En İyi Uygulamalar:
- Doğrudan erişilmemesi gereken dahili veriler için
privatekullanın - Alt sınıfların ihtiyaç duyduğu veriler için
protectedkullanın - Yalnızca güvenli harici erişimler için
publickullanın
Kendin dene
<?php
require_once 'Manager.php';
// Girdileri oku
$name = trim(fgets(STDIN));
$employeeId = trim(fgets(STDIN));
$salary = intval(trim(fgets(STDIN)));
$department = trim(fgets(STDIN));
// TODO: Giriş değerleriyle bir Manager örneği oluşturun
// TODO: Yöneticinin adını yazdırın (doğrudan genel özellik olarak erişilir)
// TODO: getTeamInfo() çağrısının sonucunu yazdırın
// TODO: getSalary() çağrısının 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