PHP ma osiem typów, których używasz na co dzień: int, float, string, bool, array, object, null oraz callable dla funkcji przekazywanych dalej. Zmienna nie ma stałego typu; ma go jej bieżąca wartość. var_dump($x) pokazuje zarówno typ, jak i wartość, a gettype($x) zwraca typ jako łańcuch.
Pierwsza kolumna to gettype(), druga get_debug_type(). Zamień wartość na własną i uruchom kod ponownie. Funkcje różnią się w kilku nazwach: gettype z przyczyn historycznych podaje integer, double i boolean, a get_debug_type używa nazw z deklaracji typów (int, float, bool) i dla obiektu podaje nazwę klasy.
Typy PHP w skrócie
| Typ | Przykład | Uwagi |
|---|---|---|
int | 42, -7, 0x1A, 1_000_000 | liczby całkowite, 64-bitowe w nowoczesnych systemach |
float | 3.14, 1.5e3 | liczby dziesiętne, niedokładne jak w każdym języku |
string | "hi", 'hi' | ciąg bajtów, nie znaków |
bool | true, false | bez rozróżniania wielkości liter (TRUE też działa) |
array | [1, 2], ["a" => 1] | uporządkowana mapa: lista i słownik w jednym |
object | new User(), new stdClass() | instancja klasy |
null | null | jedyna wartość typu null; także „brak ustawionej wartości” |
callable | 'strlen', fn($x) => $x * 2 | wszystko, co można wywołać |
iterable | tablica albo obiekt Traversable | to, co przyjmuje foreach |
resource | wynik fopen() | uchwyt do czegoś poza PHP |
Podgląd wartości przez var_dump
var_dump to narzędzie, które pokazuje, co naprawdę masz. Wypisuje typ, wartość, a dla łańcuchów długość w bajtach:
echo wypisałoby 10 dla pierwszych trzech i ukryło różnicę. Długość w string(5) "café" liczy bajty, dlatego strlen i mb_strlen dają różne wyniki dla tekstu spoza ASCII.
Liczby całkowite i zmiennoprzecinkowe
Liczba całkowita to liczba bez części ułamkowej. Literały mogą zawierać podkreślniki dla czytelności oraz zapis szesnastkowy, ósemkowy i binarny. Float to każda liczba z kropką dziesiętną lub wykładnikiem i, jak w każdym języku, większość ułamków dziesiętnych przechowuje w przybliżeniu:
Nigdy nie porównuj floatów przez ==; porównuj różnicę z małą tolerancją albo najpierw zaokrąglij obie strony. Kwoty pieniężne przechowuj jako całe grosze w liczbach całkowitych.
Wartości logiczne i to, co jest fałszem
bool to true albo false. Tam, gdzie PHP oczekuje warunku (if, while, !), każda wartość jest zamieniana na bool, a fałszem jest krótka lista wartości: false, 0, 0.0, "", "0", [] i null. Wszystko inne jest prawdą. Tabela pokazuje każdą wartość z jej typem, konwersją na bool i informacją, czy jest liczbowa:
| $x | gettype | bool | is_numeric |
|---|---|---|---|
| 0 | |||
| 1 | |||
| -1 | |||
| 0.0 | |||
| 1.5 | |||
| "0" | |||
| "" | |||
| " " | |||
| "0.0" | |||
| "10" | |||
| "1e1" | |||
| "abc" | |||
| "null" | |||
| true | |||
| false | |||
| null | |||
| [] | |||
| [0] |
Zaskakują "0.0", " " i "null": wszystkie trzy to niepuste łańcuchy inne niż "0", więc są prawdą i if ($value) wykonuje dla nich swoje ciało.
Tablice, obiekty i null
Tablica przechowuje dowolną mieszankę wartości pod kluczami całkowitymi lub tekstowymi. Obiekt to instancja klasy; stdClass to pusta klasa PHP do szybkich obiektów, a (object) zamienia tablicę w taki obiekt. null oznacza „brak wartości”:
Sprawdzanie typu funkcjami is_*
Każdy typ ma funkcję testującą, która zwraca true albo false. is_numeric różni się od is_int: przyjmuje też łańcuchy liczbowe, a tego właśnie chcesz przy sprawdzaniu danych z formularza.
Pozostałe: is_bool, is_array, is_object, is_null, is_callable, is_iterable oraz $x instanceof ClassName dla konkretnej klasy.
Żonglowanie typami i strict types
PHP automatycznie konwertuje typy, gdy operator potrzebuje innego. Łańcuch liczbowy użyty w arytmetyce staje się liczbą, a . zamienia liczby w łańcuchy. Łańcucha, który w ogóle nie jest liczbą, nie da się dodać i PHP 8 rzuca TypeError:
Parametry z typami też konwertują, chyba że plik zaczyna się od declare(strict_types=1);. Wtedy wywołanie ze złym typem skalarnym kończy się błędem zamiast konwersji:
Aby konwertować celowo, rzutuj: (int) "42", (float) "3.5", (string) 10, (bool) "0". Strona o rzutowaniu typów opisuje każde rzutowanie i jego przypadki brzegowe.
Częsty błąd: porównywanie różnych typów przez ==
Ponieważ == konwertuje przed porównaniem, dwie wartości różnych typów mogą być „równe” w sposób, który prowadzi do błędów, na przykład "1e1" == "10" (obie to liczba 10) albo null == false. Używaj ===, które wymaga też tego samego typu, chyba że chcesz konwersji:
PHP 8 naprawił najgorszy przypadek: "abc" == 0 dawało kiedyś true, a teraz daje false, bo łańcuch nieliczbowy jest porównywany jako łańcuch. Pełne tabele są na stronie o operatorach porównania.
Najczęściej zadawane pytania
Jak sprawdzić typ zmiennej w PHP?
var_dump($x) wypisuje typ i wartość, na przykład int(5). gettype($x) zwraca nazwę typu jako łańcuch ("integer"), a get_debug_type($x) zwraca nowoczesną nazwę ("int" albo nazwę klasy dla obiektów). Aby sprawdzić jeden typ, użyj is_int, is_string, is_array i pozostałych funkcji is_*.
Dlaczego gettype zwraca "double" dla liczby zmiennoprzecinkowej?
Z przyczyn historycznych gettype() zgłasza liczby zmiennoprzecinkowe jako "double", a całkowite jako "integer". get_debug_type(), dodane w PHP 8, zwraca "float" i "int", czyli te same nazwy, które piszesz w deklaracjach typów.
Które wartości są fałszywe w PHP?
Po zamianie na bool false dają: false, 0, 0.0, "", "0", [] i null. Wszystko inne to true, także "0.0", " " i "false".
Jaka jest największa liczba całkowita w PHP?
PHP_INT_MAX, czyli 9223372036854775807 w systemach 64-bitowych. Dodawanie ponad tę wartość nie zawija się: wynik staje się liczbą zmiennoprzecinkową i traci precyzję.
Czy PHP jest typowany silnie czy słabo?
PHP jest typowany dynamicznie i domyślnie konwertuje typy, gdy to możliwe ("10" + 5 daje 15). Z declare(strict_types=1); na początku pliku wywołania funkcji z typami w tym pliku odrzucają złe typy skalarne błędem TypeError zamiast je konwertować.