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:
100Pró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.comKluczowa 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.
Wyzwanie
ŁatwyZbudujmy 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 poEmployee. 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 klasyManagero imieniu i nazwisku"Sarah", wynagrodzeniu75000i dziale"Engineering". Wyświetl szczegóły menedżera za pomocągetDetails(). Następnie podnieś wynagrodzenie menedżera o5000i 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()
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online