Menu
Coddy logo textTech

Public, protected, private

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 38 z 91.

Witaj w rozdziale poświęconym enkapsulacji! Enkapsulacja polega na kontrolowaniu dostępu do wewnętrznych danych klasy. PHP udostępnia trzy modyfikatory dostępu, które określają, skąd można uzyskać dostęp do właściwości i metod: public, protected i private.

Oto jak działa każdy modyfikator:

<?php
class BankAccount {
    public $accountHolder;    // Dostępne z dowolnego miejsca
    protected $accountNumber; // Dostępne w tej klasie i klasach pochodnych
    private $balance;         // Dostępne tylko w tej klasie
    
    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";  // Działa – publiczne
echo $account->getBalance();          // Działa – metoda publiczna

Wynik:

John
1000

Bezpośrednia próba uzyskania dostępu do $account->balance spowodowałaby błąd, ponieważ jest prywatne. To samo dotyczy $account->accountNumber spoza hierarchii klas. Ta ochrona gwarantuje, że wrażliwe dane można modyfikować wyłącznie za pomocą kontrolowanych metod.

ModyfikatorTa sama klasaKlasa potomnaPoza klasą
publicTakTakTak
protectedTakTakNie
privateTakNieNie

Najważniejsza kwestia: Używaj private w przypadku danych wewnętrznych, do których nie należy uzyskiwać bezpośredniego dostępu, protected w przypadku danych potrzebnych klasom potomnym, a public tylko wtedy, gdy bezpieczny dostęp z zewnątrz jest możliwy.

challenge icon

Wyzwanie

Łatwy

Stwórzmy bezpieczny system zarządzania pracownikami, który pokazuje, jak modyfikatory dostępu chronią wrażliwe dane. Utworzysz hierarchię klas, w której dostęp do różnych poziomów informacji zależy od tego, gdzie wykonywany jest kod: wewnątrz klasy, w klasie potomnej czy z zewnątrz.

Rozmieścisz kod w trzech plikach:

  • Employee.php: Utwórz klasę Employee, która zarządza danymi pracownika z odpowiednimi poziomami widoczności. Klasa powinna mieć:
    • Właściwość public $name zawierającą imię i nazwisko pracownika (bezpieczne do udostępnienia wszystkim)
    • Właściwość protected $employeeId zawierającą wewnętrzny identyfikator (potrzebny klasom potomnym)
    • Właściwość private $salary zawierającą poufne informacje o wynagrodzeniu (bezpośredni dostęp do niej powinna mieć tylko ta klasa)
    Konstruktor powinien przyjmować wszystkie trzy wartości i je przypisywać. Dodaj metodę publiczną getSalary(), która zwraca prywatne wynagrodzenie. To kontrolowany sposób dostępu do chronionych danych. Dodaj również metodę publiczną getPublicInfo(), która zwraca "[name] works here".
  • Manager.php: Utwórz klasę Manager, która rozszerza klasę Employee. Dołącz plik Employee. Konstruktor powinien przyjmować imię i nazwisko, employeeId, wynagrodzenie oraz nazwę działu. Wywołaj konstruktor klasy nadrzędnej, przekazując mu pierwsze trzy wartości, a następnie zapisz nazwę działu we właściwości prywatnej. Dodaj metodę publiczną getTeamInfo(), która zwraca "Manager [name] (ID: [employeeId]) leads [department]". Zwróć uwagę, że klasa potomna może uzyskać dostęp do chronionej właściwości $employeeId, ale do uzyskania dostępu do prywatnego wynagrodzenia potrzebuje metody getSalary().
  • main.php: Dołącz plik Manager. Otrzymasz cztery dane wejściowe: imię i nazwisko, identyfikator pracownika, wynagrodzenie (jako ciąg znaków, który przekształcisz na liczbę całkowitą) oraz nazwę działu. Utwórz instancję klasy Manager z tymi wartościami. Wypisz trzy wiersze:
    • Imię i nazwisko kierownika pobrane bezpośrednio (właściwość publiczna)
    • Wynik wywołania getTeamInfo()
    • Wynik wywołania getSalary()

To wyzwanie pokazuje enkapsulację w praktyce: imię i nazwisko jest swobodnie dostępne, identyfikator pracownika jest udostępniany klasom potomnym dzięki widoczności chronionej, a wynagrodzenie pozostaje ukryte w klasie nadrzędnej i jest dostępne wyłącznie za pośrednictwem kontrolowanej metody publicznej.

Spróbuj swoich sił

<?php
require_once 'Manager.php';

// Wczytaj dane wejściowe
$name = trim(fgets(STDIN));
$employeeId = trim(fgets(STDIN));
$salary = intval(trim(fgets(STDIN)));
$department = trim(fgets(STDIN));

// TODO: Utwórz instancję Manager z podanymi wartościami

// TODO: Wypisz imię menedżera (odczytane bezpośrednio z publicznej właściwości)

// TODO: Wypisz wynik wywołania getTeamInfo()

// TODO: Wypisz wynik wywołania getSalary()
?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online