PHP OOP
Maciej Żukiewicz
Programowanie obiektowe w PHP
Słowo kluczowe final
Słowo kluczowe final pozwala nam kontrolować zasady dziedziczenia i przeciążania metod.
Zapamiętaj:
- Słowa kluczowego final można użyć zarówno do klas jak i metod
- Klasę, która w swojej deklaracji posiada słowo kluczowe final nazywamy klasą finalną i tym samym blokujemy możliwość dziedziczenia po tej klasie
- Metodę, która w swojej deklaracji posiada słowo kluczowe final nazywamy metodą finalną i tym samym blokujemy możliwość przeciążania jej w klasach potomnych
Używamy przeważnie gdy, tworzymy komponenty, które zostaną udostępnione innym programistom i chcemy zablokować możliwość rozszerzania klas lub nadpisywania metod.
Trait
Trait jest odpowiedzią na problem limitu pojedynczego dziedziczenia, które występuje w PHP.
O Trait's można myśleć jak o cechach, które można przypisać do klas.
Trait
Zapamiętaj:
- Traits dostępne są od PHP 5.4
- Traits mogą posiadać zarówno właściwości jak i metody
- Bardzo częstą praktyką nazewniczą jest nazywanie wg. wzoru [NazwaWłasna]Trait (np. FilterTrait, SortTrait, etc.)
- Możemy używać wielu Trait'ów w jednej klasie
- W przypadku konfliktu nazw metod mamy możliwość decydować o użyciu konkretnej metody (mechanizm as i insteadof)
- Trait ma dostęp do właściwości i metod klasy która go używa (nawet tych chronionych i prywatnych)
- Trait może używać innych Trait'ów
- Metoda klasy zawsze ma wyższy priorytet niż metoda Trait'a
- W klasie która używa Trait'a nie mogą definicje takiej same właściwości (ale może wystąpić spójna deklaracja)
stdClass
Domyślna klasa dostępna w PHP.
Zapamiętaj:
- Nie posiada ona żadnych metod ani właściwości
- Najczęściej używana jest jako alternatywa dla tablic asocjacyjnych
- Łatwo konwertować klasę do tablicy asocjacyjnej (i na odwrót)
- Po tej klasie można dziedziczyć... ale po co? :)
Alternatywne sposoby dostępu do właściwości i metod
- Dostęp do właściwości i metod po nazwie znajdującej się w innej zmiennej
- Wywoływanie metody za pomocą metody call_user_func_array()
Metody magiczne
Metody magiczne to zamknięty zbiór metod, które są automatycznie wywoływane przez PHP w specyficznych sytuacjach, a my jako programiści możemy je w dowolny sposób zaimplementować.
Zapamiętaj:
- Definiujemy je w klasach;
- Nazwy tych metod zaczynają się od podwójnego znaku podkreślenia (__[nazwa metody]);
- Muszą być zadeklarowane jako publiczne (za wyjątkiem konstruktora, ale o tym później :));
-
Nie możesz wywoływać ich bezpośrednio (odnosząc się do nich) - są one wywoływane automatycznie przez PHP w specyficznych sytuacjach;
-
Nie możesz definiować “własnych” metod o takich nazwach jak metody magiczne - ich nazwy są zarezerwowane;
Metody magiczne
Używane często
__construct()
__destruct()
__get()
__set()
__call()
__invoke()
__toString()
__clone()
__sleep()
__wakeup()
__isset()
__callStatic()
__set_state()
__debugInfo()
__unset()
__serialize() (dostępne od PHP 7.4)
__unserialize() (dostępne od PHP 7.4)
Używane rzadko
Przydatne linki dotyczące metod magicznych
9 Magic Methods in PHP (dzone.com)
16 Magic Methods That PHP Developers Must Know (tutorialdocs.com)
Porównywanie obiektów
Obiekty są referencjami, a nie wartościami.
Przetestuj:
- Porównaj dwa obiekty będące instancjami różnych klas o różnych właściwościach i wartościach za pomocą operatora == i ===
- Porównaj dwa obiekty będące instancjami różnych klas o takich samych właściwościach i wartościach za pomocą operatora == i ===
- Porównaj dwa obiekty będące instancjami różnych klas o takich samych właściwościach i różnych wartościach za pomocą operatora == i ===
- Porównaj dwa obiekty będące instancjami tej samej klasy o różnych wartościach za pomocą operatora == i ===
- Porównaj dwa obiekty będące instancjami tej samej klasy o takich samych wartościach za pomocą operatora == i ===
Płynny interfejs
Dzięki zwracaniu odpowiedniego typu możemy łączyć metody w łańcuchy wywołań.
Interfejsy
Interfejs jest to swojego rodzaju "umowa" opisująca jakie metody powinny posiadać klasy implementujące ten interfejs.
Zapamiętaj:
czyli po polskiemu międzytwarze 🤣
- W interfejsach możesz jedynie deklarować metody
- W interfejsach nie możesz ani deklarować ani definiować właściwości
- Nie możemy stworzyć obiektu z interfejsu - interfejsy "podpinamy" do klas
- Bardzo częstą praktyką nazewniczą jest nazywanie wg. wzoru [NazwaWłasna]Interface (np. ReadableInterface, StorageInterface, etc.)
- Klasy mogą implementować wiele interfejsów
Klasy abstrakcyjne
Klasy abstrakcyjne posiadają cechy interfejsów jak i zwykłych klas.
Zapamiętaj:
- Pozwalają na deklaracje metod, które muszą być zaimplementowane przez klasy dziedziczące po tej klasie abstrakcyjnej (cecha interfejsu);
- Pozwalają na definiowanie metod, które dziedziczone są przez inne klasy dziedziczące (cecha klasy);
- Pozwala na deklarację i/lub definicję właściwości (cecha klasy);
- Nie można tworzyć obiektu będącego instancją klasy abstrakcyjnej (cecha interfejsu);
- Bardzo częstą praktyką nazewniczą jest nazywanie wg. wzoru Abstract[NazwaWłasna] (np. AbstractStorage, AbstractAdmin, etc.)
Badanie typu i pochodzenia obiektów i klas
get_class()
instanceof
is_a()
class_exists()
method_exists()
interface_exists()
class_implements()
class_parents()
get_declared_interfaces()
przydatne funkcje i operatory
Przydatne funkcje i operatory:
Zapamiętaj:
- operator instanceof pozwoli Ci sprawdzić czy obiekt implementuje interfejs oraz dziedziczy po klasie
- W PHP od 7.4 mamy poprawiony mechanizm wariancji typów (!)
Przestrzenie nazw
O przestrzeniach nazw możesz myśleć jak o folderach na dysku, dzięki którym w różnych folderach możesz:
a) mieć pliki (a w PHP funkcje i klasy) o tej samej nazwie;
b) utrzymywać porządek na swoim dysku (a w PHP w swoim kodzie)
Zapamiętaj:
- Wszystkie wbudowane w PHP funkcje i klasy dostępne są w głównej (globalnej) przestrzeni nazw;
- Przy definiowaniu nazwy przestrzeni nazw należy zachowywać konwencję camelCase;
- Nazwy przestrzeni nazw powinny de facto odzwierciedlać strukturę folderów w aplikacji;
UML
Zunifikowany Język modelowania
Jest to język modelowania składający się z kilkunastu rodzajów diagramów, dzięki którym możemy opisać i modelować cały system, a dokładnie struktury i procesy w nim zachodzące.
Unified Modeling Language
Dokumentacja (796 stron!)
UML
Unified Modeling Language
Zapamiętaj:
- Jeżeli masz trudność z wyobrażeniem sobie zależności między klasami to zanim zaczniesz kodować narysuj diagram!
- Nie dąż do perfekcji względem standardu! Diagram ma pomóc, a nie utrudnić Tobie (i innym) zrozumienie Twojego rozwiązania.
- Ćwicz diagramy klas poprzez próbę zamodelowania klas i relacji w znanych Ci odpowiednikach świata rzeczywistego: sklep internetowy, szkoła, wypożyczalnia, biblioteka etc. - jest to świetny sposób nauki obiektowości.
Going on-line ;)
W programie
- Konfiguracja NetBeans
- Przestrzenie nazw
- Projektowanie aplikacji (diagramy UML)
- Debuggowanie aplikacji
- Testowanie aplikacji i test-driven development
PHP OOP
By Maciej Żukiewicz
PHP OOP
- 267