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 bölümüne hoş geldin! Kapsülleme, sınıfının iç verilerine erişimi kontrol etmekle ilgilidir. PHP, özelliklere ve metotlara nereden erişilebileceğini belirleyen üç erişim belirleyicisi sunar: public, protected ve private.

Her 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ıfta ve alt sınıflarda erişilebilir
    private $balance;         // Yalnızca bu sınıfta 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 method

Çıktı:

John
1000

$account->balance öğesine doğrudan erişmeye çalışmak, bu özellik private olduğu için hataya neden olur. Aynı durum, sınıf hiyerarşisinin dışından $account->accountNumber için de geçerlidir. Bu koruma, hassas verilerin yalnızca denetimli yöntemler aracılığıyla değiştirilebilmesini sağlar.

DeğiştiriciAynı SınıfAlt SınıfDışarıdan
publicEvetEvetEvet
protectedEvetEvetHayır
privateEvetHayırHayır

Önemli Nokta: Doğrudan erişilmemesi gereken dahili veriler için private, child 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

Hassas verileri erişim belirleyicilerinin 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 farklı bilgi düzeylerine erişilebilen bir sınıf hiyerarşisi oluşturacaksın: sınıfın içinde, alt sınıfta veya dışarıdan.

Kodunu üç dosya arasında düzenleyeceksin:

  • Employee.php: Çalışan verilerini uygun görünürlük düzeyleriyle yöneten bir Employee sınıfı oluştur. Sınıf şunlara sahip olmalı:
    • Çalışanın adı için bir public özelliği olan $name (herkesin görmesi güvenlidir)
    • Dahili kimlik için bir protected özelliği olan $employeeId (alt sınıflar tarafından gereklidir)
    • Hassas maaş bilgileri için bir private özelliği olan $salary (bu özelliğe doğrudan yalnızca bu sınıf erişebilmelidir)
    Yapıcı, üç değerin tamamını kabul etmeli ve bunları atamalıdır. Özel maaşı döndüren bir getSalary() public metodu ekle. Protected verilere erişmenin kontrollü yolu budur. Ayrıca "[name] works here" döndüren bir getPublicInfo() public metodu ekle.
  • Manager.php: Employee sınıfını genişleten bir Manager sınıfı oluştur. Employee dosyasını dahil et. Yapıcı; name, employeeId, salary ve bir departman adını kabul etmelidir. İlk üç değerle üst sınıfın yapıcısını çağır, ardından departmanı private bir özellikte sakla. "Manager [name] (ID: [employeeId]) leads [department]" döndüren bir getTeamInfo() public metodu ekle. Alt sınıfın protected $employeeId özelliğine erişebildiğine, ancak private maaşa erişmek için getSalary() kullanması gerektiğine dikkat et.
  • main.php: Manager dosyasını dahil et. Dört girdi alacaksın: bir ad, bir çalışan kimliği, bir maaş (dize olarak alıp tam sayıya dönüştüreceksin) ve bir departman adı. Bu değerlerle bir Manager örneği oluştur. Üç satır yazdır:
    • Doğrudan erişilen yöneticinin adı (public özellik)
    • getTeamInfo() çağrısının sonucu
    • getSalary() çağrısının sonucu

Bu görev kapsüllemenin işleyişini gösterir: ada serbestçe erişilebilir, çalışan kimliği protected görünürlük aracılığıyla 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.

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: Girdi değerleriyle bir Manager örneği oluştur

// TODO: Yöneticinin adını yazdır (doğrudan public özellik olarak erişilir)

// TODO: getTeamInfo() çağrısının sonucunu yazdır

// TODO: getSalary() çağrısının sonucunu yazdır
?>
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

Kendi başına pratik yap: Online PHP derleyicisi