Klasę w PHP deklaruje się przez class Name { ... }; zawiera właściwości (zmienne) i metody (funkcje). new Name() tworzy z niej obiekt, a -> czyta właściwość lub wywołuje metodę: $user->name, $user->greet().
Klasa to szablon, a obiekt to jedna rzecz z niego zbudowana. Z jednej klasy możesz utworzyć tyle obiektów, ile potrzebujesz, a każdy ma własne wartości właściwości.
Właściwości i metody
Właściwość deklaruje się słowem kluczowym widoczności, opcjonalnym typem i opcjonalną wartością domyślną. Metoda to funkcja wewnątrz klasy. W metodzie $this to obiekt, na którym ją wywołano, więc $this->balance czyta saldo tego obiektu.
Każdy obiekt ma własne $balance: wpłata na $a nie rusza $b. Ustawianie właściwości jedna po drugiej po new szybko staje się męczące; konstruktor przyjmuje wartości początkowe jako argumenty.
public, private i protected
Widoczność określa, kto może ruszać właściwość lub wywoływać metodę:
| Słowo kluczowe | Dostępne z |
|---|---|
public | dowolnego miejsca |
protected | samej klasy i klas, które ją rozszerzają |
private | tylko klasy, która to deklaruje |
Prywatna właściwość i publiczne metody to sposób, w jaki klasa pilnuje własnych zasad. Tutaj saldo może zmienić się tylko przez deposit() i withdraw(), które odrzucają złe kwoty:
Odczyt prywatnej właściwości spoza klasy to nie ostrzeżenie, tylko Error:
Właściwości typowane i niezainicjowane wartości
Właściwość typowana bez wartości domyślnej zaczyna jako niezainicjowana, co różni się od null. Odczyt przed przypisaniem czegokolwiek rzuca Error. Daj jej wartość domyślną, przypisz ją w konstruktorze albo uczyń ją nullable przez ?Type i = null.
Typy są wymuszane przy przypisaniu. W domyślnym (nieścisłym) trybie $p->stock = '7' zamienia string liczbowy na 7, a $p->stock = 'many' rzuca TypeError.
Właściwości readonly
Właściwość readonly (PHP 8.1) można zapisać raz, z wnętrza klasy, a potem już nigdy. To zwykły sposób budowania obiektów wartości, takich jak kwoty pieniężne czy identyfikatory. PHP 8.2 dodało readonly class, które czyni readonly każdą właściwość.
Właściwość readonly musi mieć typ i nie może mieć wartości domyślnej. Jeśli potrzebujesz zmienionej kopii, utwórz nowy obiekt (new Order('B-2002')) zamiast edytować stary.
Wypisywanie obiektu przez __toString
echo $object działa tylko wtedy, gdy klasa definiuje __toString(). Metoda zwraca string, którego PHP używa zawsze, gdy obiekt jest traktowany jak tekst: w echo, przy łączeniu stringów, w "{$object}".
Bez __toString echo $object rzuca Error („Object of class Money could not be converted to string”). Do debugowania print_r() i var_dump() działają na każdym obiekcie i pokazują też właściwości prywatne; zobacz var_dump i print_r.
Przypisanie obiektu go nie kopiuje
To błąd, na który najczęściej nadziewają się osoby przyzwyczajone do tablic. Przypisanie tablicy ją kopiuje. Przypisanie obiektu kopiuje tylko uchwyt: obie zmienne wskazują wtedy ten sam obiekt.
clone robi płytką kopię: jeśli właściwość zawiera inny obiekt, obie kopie nadal współdzielą ten wewnętrzny obiekt. === daje prawdę tylko dla tego samego obiektu, a == porównuje wartości właściwości dwóch obiektów tej samej klasy. Przekazanie obiektu do funkcji działa tak samo jak przypisanie, więc funkcja może zmienić otrzymany obiekt.
Najczęściej zadawane pytania
Jak utworzyć obiekt z klasy w PHP?
Użyj new z nazwą klasy: $user = new User();. Jeśli klasa ma konstruktor, przekaż jego argumenty w nawiasach, jak w new User('Ada'). Potem wywołujesz metody i czytasz właściwości operatorem strzałki: $user->name, $user->greet().
Co oznacza $this w PHP?
$this to obiekt, na którym wywołano bieżącą metodę. Wewnątrz $ada->greet() $this to $ada, więc $this->name czyta imię Ady. Istnieje tylko w metodach niestatycznych.
Czym różnią się public, private i protected w PHP?
Elementów public można używać z dowolnego miejsca, private tylko wewnątrz klasy, która je deklaruje, a protected w tej klasie i w jej klasach potomnych. Odczyt prywatnej właściwości z zewnątrz rzuca Error: Cannot access private property.
Czy obiekty w PHP są przekazywane przez referencję?
Zmienna przechowuje uchwyt do obiektu, a nie sam obiekt. $b = $a; kopiuje uchwyt, więc obie zmienne wskazują ten sam obiekt, a zmiana przez $b jest widoczna w $a. Użyj $b = clone $a;, aby dostać niezależną kopię.
Czym jest właściwość readonly w PHP?
Właściwość zadeklarowaną jako public readonly string $id; (PHP 8.1+) można ustawić raz, z wnętrza klasy, i nigdy później nie zmienić. Drugi zapis rzuca Error: Cannot modify readonly property.