Menu
Coddy logo textTech

Właściwości prywatne i chronione

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

Do tej pory używaliśmy właściwości public, do których można uzyskać dostęp z dowolnego miejsca. Czasami jednak trzeba ograniczyć dostęp, aby chronić swoje dane. PHP udostępnia dwa dodatkowe modyfikatory widoczności: private i protected.

Do właściwości private można uzyskać dostęp tylko z wnętrza klasy, która ją definiuje:

<?php
class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();

Wynik:

100

Próba uzyskania dostępu do $account->balance bezpośrednio spoza klasy spowodowałaby błąd. Chroni to saldo przed zmianą bez użycia metody deposit.

Właściwość protected działa podobnie, ale mogą uzyskiwać do niej dostęp także klasy potomne, które rozszerzają klasę nadrzędną:

<?php
class User {
    protected $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

class Admin extends User {
    public function showEmail() {
        return $this->email;
    }
}

$admin = new Admin("admin@example.com");
echo $admin->showEmail();

Wynik:

admin@example.com

Kluczowa kwestia: Używaj private, gdy tylko klasa definiująca powinna mieć dostęp do właściwości. Używaj protected, gdy dostęp jest potrzebny również klasom potomnym. Oba te modyfikatory uniemożliwiają bezpośredni dostęp z zewnątrz, chroniąc wewnętrzny stan obiektu.

challenge icon

Wyzwanie

Łatwy

Zbudujmy bezpieczny system zarządzania pracownikami, który pokazuje, jak chronić poufne dane za pomocą właściwości prywatnych i chronionych.

Utworzysz trzy współpracujące ze sobą pliki, które będą zarządzać informacjami o pracownikach z odpowiednią kontrolą dostępu:

  • Employee.php: Zdefiniuj klasę Employee, która będzie klasą bazową dla wszystkich pracowników. Powinna mieć właściwość protected $name (aby klasy potomne mogły uzyskać do niej dostęp) oraz właściwość private $salary (tylko ta klasa powinna bezpośrednio modyfikować wynagrodzenia). Konstruktor przyjmuje imię i nazwisko oraz wynagrodzenie, ustawiając obie właściwości. Dodaj publiczną metodę getName(), która zwraca imię i nazwisko, publiczną metodę getSalary(), która zwraca wynagrodzenie, oraz publiczną metodę giveRaise($amount), która zwiększa wynagrodzenie o podaną kwotę.
  • Manager.php: Zdefiniuj klasę Manager, która dziedziczy po Employee. Na początku dołącz plik Employee. Dodaj prywatną właściwość $department. Konstruktor powinien przyjmować imię i nazwisko, wynagrodzenie oraz dział: wywołaj konstruktor klasy nadrzędnej za pomocą parent::__construct($name, $salary), a następnie ustaw dział. Utwórz metodę getDetails(), która zwraca "[name] manages [department]", uzyskując bezpośredni dostęp do chronionej właściwości $name. Dodaj też metodę getDepartment(), która zwraca dział.
  • main.php: Dołącz oba pliki klas. Utwórz obiekt klasy Manager o imieniu i nazwisku "Sarah", wynagrodzeniu 75000 i dziale "Engineering". Wyświetl szczegóły menedżera za pomocą getDetails(). Następnie podnieś wynagrodzenie menedżera o 5000 i wyświetl jego nowe wynagrodzenie za pomocą getSalary(). Każdy wynik powinien znaleźć się w osobnym wierszu.

Zwróć uwagę, że klasa Manager może uzyskać bezpośredni dostęp do chronionej właściwości $name, ale aby uzyskać dostęp do prywatnego wynagrodzenia, musi użyć metody getSalary(). To pokazuje kluczową różnicę między widocznością chronioną a prywatną: widoczność chroniona umożliwia dostęp klasom potomnym, a prywatna całkowicie ukrywa dane.

Spróbuj swoich sił

<?php
require_once 'Employee.php';
require_once 'Manager.php';

// TODO: Utwórz obiekt Manager o imieniu "Sarah", wynagrodzeniu 75000 i dziale "Engineering"

// TODO: Wyświetl szczegóły menedżera za pomocą getDetails()

// TODO: Przyznaj menedżerowi podwyżkę w wysokości 5000

// TODO: Wyświetl nowe wynagrodzenie za pomocą 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