Menu

Klasy i obiekty w PHP: właściwości, metody i $this

Klasa w PHP to szablon zadeklarowany przez class Name { }, a new Name() tworzy z niego obiekt. Poznaj właściwości, metody, $this, public/private/protected, właściwości typowane i readonly, __toString i powód, dla którego przypisanie obiektu go nie kopiuje.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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 kluczoweDostępne z
publicdowolnego miejsca
protectedsamej klasy i klas, które ją rozszerzają
privatetylko 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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ