👋 Wstęp
Cześć cześć! 😉
Postanowiłem trochę poopisywać to co najbardziej znam, a tym samym będzie to język PHP. Zaczniemy od systemu typów, który w tym języku jest nawet ciekawy, a i mam nadzieję że w kolejnych wersjach pojawią się coraz to ciekawsze rzeczy.
System typów, będziemy omawiać na wersji PHP 8.2. Jeśli będziesz to czytać w przyszłości kiedy to już będą inne wersje PHP to polecam nadgonić zmiany w dokumentacji. Mam nadzieję, że będą się pojawiać kolejne Release notes takie jak tu: https://www.php.net/releases/8.2/en.php 🚀
🔍 Base types
W PHP stanowią (jak w sumie sama nazwa mówi) podstawowe typy. Generalnie nie powinny one stanowić żadnych problemów przy ich stosowaniu. Część z nich na pewno znasz z innych języków, zwłaszcza typy skalarne, które w większości języków są podobne, a czasem identico.
🧱 Built-in types
Typy wbudowane to typy:
- null
- array
- object
- resource
- never
- void
- Relative class types: self, parent, and static
- Typy skalarne:
- bool
- int
- float
- string
- callable
Wszystkie ww. typy są ściśle zintegrowane z PHP i nie mogą być powielane przez typy stworzone przez użytkownika.
Szczegółowo to, który typ w jaki sposób działa, będę omawiać w kolejnych wpisach.
🔤 Literal types
Są to typy, które nie tylko sprawdzają typ wartości, ale także samą wartość. W PHP są tylko dwa typy literalne: true ✅ oraz false ❎. Dzięki nim można zdefiniować metody, które zawsze mają zwrócić true oraz takie, które zawsze muszą zwrócić false
👥 User-defined types
Są to wszelkiego rodzaju interfejsy, klasy oraz enumeracje. Wszystko to co jest potrzebne do OOP i przestrzeganiu zasad SOLID, DRY, 💋, YAGNI, … .
Użytkownik PHP sam sobie definiuje te typy, to jak się nazywają i jak mają się zachowywać 💡
🔀 Composite types
Typy kompozytowe to takie, które łączą kilka typów prostych w typy złożone. W PHP można robić to na dwa sposoby.
🌐 Intersection types
Krzyżówkę typów można robić za pomocą znaku &
. Tak połączone typy akceptują wartości tylko te, które spełniają wiele deklaracji, to trochę tak jakby zmiksować dwa typy w jeden i oczekiwać, że coś ma oba typy na raz 🤝
Załóżmy przypadek kiedy coś implementuje interfejsy A, B oraz C. Jeśli będziemy chcieli oczekiwać jako argument metody coś co jest skrzyżowaniem tych trzech interfejsów no to zrobimy coś takiego:
public function someMethod(A&B&C $abc);
Może jest to mało czytelne, a sam problem opisany w przykładzie da się inaczej i czytelniej rozwiązać, to może przyda się to do innych zastosowań ✨
🔗 Union types
Union type jest czymś na zasadzie „ten typ albo tamten typ”. Union type akceptuje wartości wielu różnych typów. Aby taki typ łączny zadeklarować trzeba użyć znaku |
Załóżmy przypadek oczekujemy interfejsu A albo B albo C jako argument metody. Sama klasa, którą użyjemy jako argumentu nie musi implementować wszystkich trzech interfejsów, wystarczy tylko jeden z nich.
public function someMethod(A|B|C $abc);
Typy kompozytowe omówię dokładnie w kolejnych wpisach 😉
🔄 Type aliases
PHP posiada tylko dwa typy aliasu.
- mixed, który odpowiada union type:
object|resource|array|string|float|int|bool|null
– czyli większość z Built-in Types - iterable, który odpowiada union type:
Traversable|array
Jeśli kogoś interesuje tworzenie własnych aliasów no to muszę niestety zabić entuzjazm: PHP tego nie wspiera. Można używać tylko ww. aliasów… noo, ale zawsze można pisać swoje unon types 😀(pss, można zrobić Value Object i ominąć ten problem, ale ciiii 🤫)
📝 Podsumowanie
W tym artykule zgłębiliśmy system typów w PHP, odkrywając różnorodność podstawowych, wbudowanych i zdefiniowanych przez użytkownika typów. Poznaliśmy typy skalarne, kompozytowe, krzyżówki i unie, a także aliasy typów💡
Dzięki zdobytym informacjom, możemy tworzyć efektywny i bezpieczny kod, wykorzystując bogactwo typów dostępnych w PHP. 💪🚀