Trzy poziomy dostępu do właściwości i metod: public, private, protected
Właściwość private jest widoczna tylko wewnątrz własnej klasy
Publiczna metoda jako jedyna droga do prywatnej właściwości
Ćwiczenie: private $price w class-product.php i metoda getPrice()
Rozgrzewka · 3 minuty
Rozgrzewka: __construct i __destruct
Kiedy PHP wywołuje __construct()?
Czy konstruktor jest obowiązkowy w każdej klasie?
Kiedy PHP wywołuje __destruct()?
Część 1 · Trzy poziomy dostępu
Trzy poziomy dostępu: public, private, protected
Do tej pory każda właściwość klasy Product była public - widoczna wszędzie. PHP ma jeszcze dwa poziomy: private (widoczna tylko wewnątrz własnej klasy) i protected (widoczna w klasie i w klasach, które po niej dziedziczą - to temat spoza tej lekcji). To jak trzy poziomy dostępu w mieszkaniu: do salonu (public) wchodzi każdy, do pokoju rodzinnego (protected) tylko domownicy, do prywatnej szafki (private) tylko jej właściciel.
PHP Manual: „Class members declared public can be accessed everywhere. Members declared protected can be accessed only within the class itself and by inheriting and parent classes. Members declared as private may only be accessed by the class that defines the member” · php.net/manual/en/language.oop5.visibility.php
Część 2 · Private z zewnątrz
private: błąd przy dostępie z zewnątrz
classProduct {
public$name;
private$price;
// ... __construct jak na lekcji poprzedniej
}
$product1 = newProduct("Keyboard", 120);
echo$product1->name; // Keyboard - działa, name jest publicecho$product1->price; // Fatal error - price jest private
Ciekawostka z PHP Manual: reguła private nie blokuje dostępu między dwoma obiektami tej samej klasy. Wewnątrz metody klasy Product wolno odczytać price innego obiektu Product, mimo że jest private: PHP pilnuje granicy klasy, nie granicy pojedynczego obiektu.
PHP Manual: language.oop5.visibility.php · php.net/manual/en/language.oop5.visibility.php · ciekawostka: „Objects of the same type will have access to each others private and protected members even though they are not the same instances” · php.net/manual/en/language.oop5.visibility.php
PHP Manual: language.oop5.visibility.php (metody i właściwości) · php.net/manual/en/language.oop5.visibility.php
Egzamin INF.03
Tak pytają na egzaminie
1. Do którego pola klasy Data możliwy będzie dostęp z zewnątrz poprzez nazwę obiektu utworzonego jako instancja tej klasy?
classData {
public$a;
private$b;
protected$c;
}
Do wszystkich pól.
Do pola $a.
Do pola $b.
Do pola $c.
2. Klasa Product ma private $price i publiczną metodę getPrice(), która zwraca $this->price. Który zapis NIE spowoduje błędu?
echo $product1->price;
echo $product1->getPrice();
$product1->price = 10;
print $product1->price;
CKE, EE.09, styczeń 2021, zadanie 3
Ćwiczenie przy komputerze · 20 minut
Ćwiczenie: private $price i getPrice() w class-product.php
Otwórz class-product.php z folderu swojego serwera (np. htdocs) - plik z poprzedniej lekcji.
Zmień public $price; na private $price; ($name zostaje public).
W class Product dopisz metodę public function getPrice() { return $this->price; }.
W liniach z echo zamień $product1->price i $product2->price na $product1->getPrice() i $product2->getPrice().
Na chwilę dopisz echo $product1->price;, odśwież localhost/class-product.php i zobacz Fatal error w przeglądarce - potem usuń tę linię.
Sprawdź stronę bez błędu - mają zostać te same dwie linie z nazwą i ceną co wcześniej.
Ma się pojawić: te same dwie linie z nazwą i ceną co na poprzednich lekcjach, tylko cena wychodzi teraz przez getPrice() - i chwilowy Fatal error w kroku 5, zanim go usuniesz.
Zasady pracowni
Na koniec
Sprawdź się
Czym różni się public od private?
Co się stanie, gdy spróbujesz odczytać właściwość private spoza klasy?
Po co potrzebna jest metoda getPrice(), skoro $price jest teraz private?
To była ostatnia lekcja tematu programowania obiektowego - na następnej: przetwarzanie danych z formularza.
Poza szkołą
A jak to wygląda w produkcji?
Na lekcji
W produkcji
Status
Właściwości oznaczone wprost public albo private
Od PHP 8.1 właściwość może być dodatkowo readonly - ustawiana raz w konstruktorze, potem nie do zmiany. Chroni to przed przypadkową zmianą danych po utworzeniu obiektu.
nadal w użyciu (rosnąca popularność)
Dostęp do private $price tylko przez ręcznie napisaną metodę getPrice()
Frameworki (np. Laravel) często generują takie metody automatycznie albo używają magicznych metod __get/__set, żeby nie pisać ich ręcznie dla każdej właściwości.
nadal w użyciu
protected tylko wspomniany, bez przykładu z dziedziczeniem
W kodzie produkcyjnym protected jest bardzo częste w klasach bazowych, po których dziedziczą inne klasy - to osobny temat (extends), poza zakresem tej lekcji.
nadal w użyciu
PHP Manual: „As of PHP 8.1.0, a property can be declared with the readonly modifier, which prevents modification of the property after initialization” · php.net/manual/en/language.oop5.properties.php