W języku PHP zastosowano funkcję is_int(). Które z podanych wywołań tej funkcji zwróci wartość TRUE?
A. is_int(13.5)
B. is_int(NULL)
C. is_int(135)
D. is_int("135")
Pytanie z egzaminu CKE, czerwiec 2018 (arkusz E.14-X-18.06).
Funkcja is_int() w PHP sprawdza rzeczywisty typ zmiennej, a nie to, czy dana wartość „wygląda jak liczba”. Dlatego wywołanie is_int(135) zwróci TRUE, bo 135 zapisane bez cudzysłowu i bez części dziesiętnej jest literałem typu integer, czyli liczbą całkowitą. To ważne w praktyce, bo PHP często automatycznie konwertuje typy, ale is_int() nie robi takiej konwersji przy sprawdzaniu. Ona po prostu pyta: czy ta wartość już teraz jest int? Moim zdaniem to jedna z tych funkcji, które dobrze pokazują różnicę między wartością a typem danych. W aplikacjach webowych przydaje się to np. przy sprawdzaniu identyfikatora użytkownika, numeru strony paginacji albo liczby sztuk produktu, ale dopiero po poprawnym pobraniu i ewentualnym rzutowaniu danych. Warto pamiętać, że dane z formularzy, GET i POST zwykle przychodzą jako stringi, więc is_int($_POST['id']) prawie zawsze da FALSE. Dobra praktyka to najpierw walidować wejście, np. filter_var($id, FILTER_VALIDATE_INT), a potem pracować na pewnym typie. Takie podejście jest czytelne, bezpieczniejsze i mniej podatne na dziwne błędy w kodzie.
W tym pytaniu łatwo pomylić wartość liczbową z typem danych, a w PHP ma to naprawdę duże znaczenie. Zapis is_int('135') albo is_int("135") nie zwróci TRUE, mimo że w środku znajduje się ciąg cyfr. Cudzysłów oznacza tekst, czyli typ string. PHP w wielu miejscach potrafi taki tekst automatycznie potraktować jak liczbę, na przykład przy prostym dodawaniu, ale funkcja is_int() działa inaczej: ona nie sprawdza, czy coś da się zamienić na liczbę całkowitą, tylko czy już jest liczbą całkowitą typu int. To taki częsty haczyk, zwłaszcza przy danych z formularzy internetowych, bo użytkownik wpisuje 135, a serwer często dostaje '135' jako tekst. Wartość NULL też nie jest liczbą całkowitą. Oznacza brak wartości, stan pusty albo niezainicjalizowany wynik, więc is_int(NULL) zwróci FALSE. Z kolei 13.5 to liczba zmiennoprzecinkowa, czyli float, ponieważ ma część ułamkową. Nawet jeśli komuś wydaje się, że „to nadal liczba”, dla funkcji sprawdzającej typ nie jest to int. Z mojego doświadczenia najczęstszy błąd polega na myśleniu, że PHP zawsze wszystko sobie samo przeliczy. Przy walidacji danych lepiej nie liczyć na automatyczne konwersje, tylko świadomie używać is_int(), is_float(), is_string(), filter_var() albo rzutowania typów tam, gdzie ma to sens. Dzięki temu kod jest bardziej przewidywalny i łatwiejszy do debugowania.