Menu
Coddy logo textTech

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 BelirleyiciAynı SınıfAlt SınıfDışarıdan
publicEvetEvetEvet
protectedEvetEvetHayır
privateEvetHayırHayı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.

challenge icon

Görev

Kolay

Eriş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 bir Employee sınıfı oluşturun. Sınıf şunlara sahip olmalıdır:
    • Çalışanın adı için public bir özellik olan $name (herkesin görmesi güvenlidir)
    • Dahili kimlik için protected bir özellik olan $employeeId (alt sınıflar tarafından ihtiyaç duyulur)
    • Hassas maaş bilgileri için private bir özellik olan $salary (yalnızca bu sınıf doğrudan erişmelidir)
    Yapıcı metot (constructor) her üç değeri de kabul etmeli ve atamalıdır. Özel maaşı döndüren bir public metot olan getSalary() ekleyin — bu, korunan verilere erişmenin kontrollü yoludur. Ayrıca "[name] works here" döndüren bir public metot olan getPublicInfo() ekleyin.
  • Manager.phpEmployee sınıfını genişleten bir Manager sı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 olan getTeamInfo() ekleyin. Alt sınıfın korumalı $employeeId özelliğine nasıl erişebildiğine, ancak özel maaşa erişmek için getSalary() 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 bir Manager örneği oluşturun. Üç satır yazdırın:
    • Doğrudan erişilen yöneticinin adı (public özellik)
    • getTeamInfo() çağrısının sonucu
    • getSalary() ç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:

BelirleyiciAynı SınıfAlt SınıfDışarıdan
publicEvetEvetEvet
protectedEvetEvetHayır
privateEvetHayırHayı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 private kullanın
  • Alt sınıfların ihtiyaç duyduğu veriler için protected kullanın
  • Yalnızca güvenli harici erişimler için public kullanı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
?>
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