Menu

Typy danych w PHP: int, float, string, bool, array, null

PHP ma dziesięć typów: cztery skalarne (int, float, string, bool), cztery złożone (array, object, callable, iterable) i dwa specjalne (null, resource). var_dump($x) pokazuje typ i wartość, a gettype($x) zwraca nazwę typu.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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

TypPrzykładUwagi
int42, -7, 0x1A, 1_000_000liczby całkowite, 64-bitowe w nowoczesnych systemach
float3.14, 1.5e3liczby dziesiętne, niedokładne jak w każdym języku
string"hi", 'hi'ciąg bajtów, nie znaków
booltrue, falsebez rozróżniania wielkości liter (TRUE też działa)
array[1, 2], ["a" => 1]uporządkowana mapa: lista i słownik w jednym
objectnew User(), new stdClass()instancja klasy
nullnulljedyna wartość typu null; także „brak ustawionej wartości”
callable'strlen', fn($x) => $x * 2wszystko, co można wywołać
iterabletablica albo obiekt Traversableto, co przyjmuje foreach
resourcewynik 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:

gettype, (bool) i is_numeric dla każdej wartości $x
Point at or tap a cell to read it as PHP.
$xgettypeboolis_numeric
0
1
-1
0.0
1.5
"0"
""
" "
"0.0"
"10"
"1e1"
"abc"
"null"
true
false
null
[]
[0]
Every cell computed by PHP 8.3.19.

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

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ