
Pierwszą przeszkodą na drodze do zrozumienia programowania obiektowego jest dziwaczność i niezwykłość relacji pomiędzy klasą a jej obiektami. Dla wielu osób właśnie pojęcie tej relacji stanowi pierwsze olśnienie, wywołuje pierwszą ekscytację programowaniem obiektowym. Nie skąpmy więc energii na poznawanie podstaw
Pierwsza klasa
Klasy są często opisywane w odniesieniu do obiektów. To bardzo ciekawe, ponieważ obiekty są z kolei niejednokrotnie opisywane przez pryzmat klas. Ta zależność bardzo spowalnia pierwsze postępy adeptów programowania obiektowego. Ponieważ to klasy definiują obiekty, zaczniemy od definicji klasy.
Krótko mówiąc, klasa to swego rodzaju szablon wykorzystywany do generowania jednego lub większej liczby obiektów. Deklaracja klasy zawiera słowo kluczowe class i dowolnie wybraną nazwę klasy. Nazwa klasy może być dowolną kombinacją cyfr i liter, nie może się jednak od cyfry zaczynać. Kod skojarzony z klasą musi być ograniczony nawiasami klamrowymi. Spróbujmy na podstawie tych informacji skonstruować klasę:
class ShopProduct { // ciało klasy }
Zdefiniowana właśnie klasa ShopPoduct jest prawidłową klasą, choć jej przydatność jest na razie znikoma. Mimo to osiągnęliśmy coś bardzo znaczącego, bo zdefiniowaliśmy typ. Utworzyliśmy więc kategorię danych, którą możemy wykorzystywać w skryptach. Znaczenie tego faktu stanie się niebawem jaśniejsze.
Pierwszy obiekt (lub dwa)
Skoro klasa jest szablonem generowania obiektów, obiekt stanowią dane, które zostały zaaranżowane zgodnie z szablonem definiowanym w klasie. Obiekt zwie się egzemplarzem klasy bądź jej konkretyzacją. Klasa definiuje jego typ.
Wykorzystamy teraz klasę ShopProduct jako formę do generowania obiektów typu ShopProduct. Pomoże nam w tym operator new. Operator new jest zazwyczaj stosowany w połączeniu z nazwą klasy, jak tutaj:
$product1 = new ShopProduct(); $product2 = new ShopProduct();
Operator new, jeśli zostanie wywoływany z nazwą klasy w roli swojego jedynego operandu, zwraca egzemplarz tejże klasy. W naszym przykładzie generuje obiekt klasy ShopProduct.
Klasę ShopProduct wykorzystaliśmy do wygenerowania dwóch obiektów typu ShopProduct. Choć funkcjonalnie $product1 i $product2 są identyczne (tzn. puste), stanowią obiekty rozłączne, a ich wspólnym mianownikiem jest jedynie wspólna klasa, na podstawie której zostały wygenerowane.
Istnienie klas i obiektów można sprowadzić do następującej analogii: klasa to jakby maszyna tłocząca gumowe kaczki. Obiektami zaś są owe gumowe kaczki produkowane przy użyciu maszyny. Ich „typ” jest wyznaczany formą, w której są odciskane. Wszystkie wypluwane z maszyny kaczki wyglądają więc identycznie, ale są niezależnymi od siebie obiektami materialnymi. Innymi słowy, są różnymi egzemplarzami pewnego przedmiotu. Aby rozróżnić poszczególne kaczki, można by im zresztą podczas wytłaczania nadawać numery seryjne. Każdy obiekt tworzony w języku PHP również posiada odrębną tożsamość, jednak unikatową jedynie w okresie życia danego obiektu (PHP ponownie wykorzystuje nieużywane już identyfikatory obiektów w obrębie tego samego procesu). Można się o tym przekonać, wydrukowując obiekty $product1 i $product2:
var_dump($product1); var_dump($product2);
Wykonanie powyższego kodu spowoduje wypisanie na wyjściu:
object(popp\r03\zestaw01\ShopProduct)#235 (0) { } object(popp\r03\zestaw01\ShopProduct)#234 (0) { }
Przekazanie obiektu do wywołania var_dump() pozwala wypisać ciekawe dane o obiekcie, z identyfikatorem obiektu na czele (po symbolu kratki). Aby klasę ShopProduct uczynić ciekawszą, możemy uzupełnić ją o obsługę specjalnych pól danych, zwanych składowymi bądź właściwościami (ang. properties).

Chcesz dogłębnie zrozumieć mechanizmy programowania obiektowego w języku PHP?
Sięgnij po "PHP. Obiekty, wzorce, narzędzia. Wydanie V" 💻
W tej książce dużo uwagi poświęcono wzorcom projektowym i ich stosowaniu. Opisano zalety wzorców i przedstawiono sporo klasycznych już rozwiązań. Nie zabrakło również omówienia narzędzi oraz metod postępowania, dzięki którym doskonały kod staje się udanym projektem ⌨️
Ten nieodzowny podręcznik dla każdego projektanta, który chce tworzyć niezawodne, eleganckie i efektywne aplikacje - teraz 70% taniej! 🔥