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
1000Bezpoś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.
| Modyfikator | Ta sama klasa | Klasa potomna | Poza klasą |
|---|---|---|---|
public | Tak | Tak | Tak |
protected | Tak | Tak | Nie |
private | Tak | Nie | Nie |
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.
Wyzwanie
ŁatwyStwó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$namezawierającą imię i nazwisko pracownika (bezpieczne do udostępnienia wszystkim) - Właściwość
protected$employeeIdzawierającą wewnętrzny identyfikator (potrzebny klasom potomnym) - Właściwość
private$salaryzawierającą poufne informacje o wynagrodzeniu (bezpośredni dostęp do niej powinna mieć tylko ta klasa)
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".- Właściwość
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 metodygetSalary().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ę klasyManagerz 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()
?>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