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:

  1. Słowa kluczowego final można użyć zarówno do klas jak i metod
  2. Klasę, która w swojej deklaracji posiada słowo kluczowe final nazywamy klasą finalną i tym samym blokujemy możliwość dziedziczenia po tej klasie
  3. 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.

When to use Final in PHP? (StackOverflow)

When to declare classes final (Marco Pivetta blog)

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:

  1. Traits dostępne są od PHP 5.4
  2. Traits mogą posiadać zarówno właściwości jak i metody
  3. Bardzo częstą praktyką nazewniczą jest nazywanie wg. wzoru [NazwaWłasna]Trait (np. FilterTrait, SortTrait, etc.)
  4. Możemy używać wielu Trait'ów w jednej klasie
  5. W przypadku konfliktu nazw metod mamy możliwość decydować o użyciu konkretnej metody (mechanizm as i insteadof)
  6. Trait ma dostęp do właściwości i metod klasy która go używa (nawet tych chronionych i prywatnych)
  7. Trait może używać innych Trait'ów
  8. Metoda klasy zawsze ma wyższy priorytet niż metoda Trait'a
  9. 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:

  1. Nie posiada ona żadnych metod ani właściwości
  2. Najczęściej używana jest jako alternatywa dla tablic asocjacyjnych
  3. Łatwo konwertować klasę do tablicy asocjacyjnej (i na odwrót)
  4. Po tej klasie można dziedziczyć... ale po co? :)

Alternatywne sposoby dostępu do właściwości i metod

  1. Dostęp do właściwości i metod po nazwie znajdującej się w innej zmiennej
  2. 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:

  1. Definiujemy je w klasach;
  2. Nazwy tych metod zaczynają się od podwójnego znaku podkreślenia (__[nazwa metody]);
  3. Muszą być zadeklarowane jako publiczne (za wyjątkiem konstruktora, ale o tym później :));
  4. Nie możesz wywoływać ich bezpośrednio (odnosząc się do nich) - są one wywoływane automatycznie przez PHP w specyficznych sytuacjach;

  5. 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

Porównywanie obiektów

Obiekty są referencjami, a nie wartościami.

Przetestuj:

  1. 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 ===
  2. 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 ===
  3. 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 ===
  4. Porównaj dwa obiekty będące instancjami tej samej klasy o różnych wartościach za pomocą operatora == i ===
  5. 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 🤣

  1. W interfejsach możesz jedynie deklarować metody
  2. W interfejsach nie możesz ani deklarować ani definiować właściwości
  3. Nie możemy stworzyć obiektu z interfejsu - interfejsy "podpinamy" do klas
  4. Bardzo częstą praktyką nazewniczą jest nazywanie wg. wzoru [NazwaWłasna]Interface (np. ReadableInterface, StorageInterface, etc.)
  5. Klasy mogą implementować wiele interfejsów

Klasy abstrakcyjne

Klasy abstrakcyjne posiadają cechy interfejsów jak i zwykłych klas.

Zapamiętaj:

  1. Pozwalają na deklaracje metod, które muszą być zaimplementowane przez klasy dziedziczące po tej klasie abstrakcyjnej (cecha interfejsu);
  2. Pozwalają na definiowanie metod, które dziedziczone są przez inne klasy dziedziczące (cecha klasy);
  3. Pozwala na deklarację i/lub definicję właściwości (cecha klasy);
  4. Nie można tworzyć obiektu będącego instancją klasy abstrakcyjnej (cecha interfejsu);
  5. 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:

  1. operator instanceof pozwoli Ci sprawdzić czy obiekt implementuje interfejs oraz dziedziczy po klasie
  2. 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:

  1. Wszystkie wbudowane w PHP funkcje i klasy dostępne są w głównej (globalnej) przestrzeni nazw;
  2. Przy definiowaniu nazwy przestrzeni nazw należy zachowywać konwencję camelCase;
  3. 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!)

Dokumentacja

UML

Unified Modeling Language

Zapamiętaj:

  1. Jeżeli masz trudność z wyobrażeniem sobie zależności między klasami to zanim zaczniesz kodować narysuj diagram!
  2. Nie dąż do perfekcji względem standardu! Diagram ma pomóc, a nie utrudnić Tobie (i innym) zrozumienie Twojego rozwiązania.
  3. Ć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

  1. Konfiguracja NetBeans
  2. Przestrzenie nazw
  3. Projektowanie aplikacji (diagramy UML)
  4. Debuggowanie aplikacji
  5. Testowanie aplikacji i test-driven development

PHP OOP

By Maciej Żukiewicz

PHP OOP

  • 267