PHP punya delapan tipe yang kamu pakai setiap hari: int, float, string, bool, array, object, null, ditambah callable untuk fungsi yang kamu oper ke mana-mana. Variabel tidak punya tipe tetap; yang punya tipe adalah nilainya saat ini. var_dump($x) menampilkan tipe dan nilainya, dan gettype($x) mengembalikan tipenya dalam bentuk string.
Kolom pertama adalah gettype(), kolom kedua get_debug_type(). Ganti salah satu nilainya dengan nilaimu sendiri, lalu jalankan lagi. Keduanya berbeda pada beberapa nama: gettype menyebut integer, double, dan boolean karena alasan sejarah, sedangkan get_debug_type memakai nama dari deklarasi tipe (int, float, bool) dan memberikan nama class untuk objek.
Sekilas tipe-tipe PHP
| Tipe | Contoh | Catatan |
|---|---|---|
int | 42, -7, 0x1A, 1_000_000 | bilangan bulat, 64-bit di sistem modern |
float | 3.14, 1.5e3 | desimal, tidak selalu persis, sama seperti di bahasa lain |
string | "hi", 'hi' | urutan byte, bukan karakter |
bool | true, false | tidak membedakan huruf besar kecil (TRUE juga bisa) |
array | [1, 2], ["a" => 1] | map berurutan: list dan dictionary sekaligus |
object | new User(), new stdClass() | instance dari sebuah class |
null | null | satu-satunya nilai bertipe null; juga berarti "belum ada nilai" |
callable | 'strlen', fn($x) => $x * 2 | apa pun yang bisa dipanggil |
iterable | array atau objek Traversable | apa yang diterima foreach |
resource | hasil dari fopen() | penunjuk ke sesuatu di luar PHP |
Memeriksa nilai dengan var_dump
var_dump adalah alat untuk melihat apa yang sebenarnya kamu punya. Fungsi ini mencetak tipe, nilai, dan untuk string, panjangnya dalam byte:
echo akan mencetak 10 untuk tiga yang pertama dan menyembunyikan perbedaannya. Panjang pada string(5) "café" menghitung byte, karena itulah strlen dan mb_strlen memberi hasil berbeda untuk teks non-ASCII.
Integer dan float
Integer adalah bilangan bulat. Literalnya boleh memakai garis bawah supaya mudah dibaca, serta notasi heksadesimal, oktal, dan biner. Float adalah angka apa pun yang punya titik desimal atau eksponen, dan seperti di semua bahasa, sebagian besar desimal disimpan sebagai perkiraan:
Jangan pernah membandingkan float dengan ==; bandingkan selisihnya dengan toleransi kecil, atau bulatkan kedua sisinya dulu. Untuk uang, simpan dalam satuan sen sebagai integer.
Boolean dan nilai yang dianggap false
bool bernilai true atau false. Di tempat PHP mengharapkan kondisi (if, while, !), nilai apa pun dikonversi menjadi bool, dan hanya sedikit nilai yang dianggap false: false, 0, 0.0, "", "0", [], dan null. Selain itu semuanya true. Tabel ini menampilkan setiap nilai beserta tipenya, hasil konversinya ke bool, dan apakah nilai itu numerik:
| $x | gettype | bool | is_numeric |
|---|---|---|---|
| 0 | |||
| 1 | |||
| -1 | |||
| 0.0 | |||
| 1.5 | |||
| "0" | |||
| "" | |||
| " " | |||
| "0.0" | |||
| "10" | |||
| "1e1" | |||
| "abc" | |||
| "null" | |||
| true | |||
| false | |||
| null | |||
| [] | |||
| [0] |
Yang mengejutkan adalah "0.0", " ", dan "null": ketiganya string tidak kosong selain "0", jadi bernilai true, dan if ($value) menjalankan isinya untuk ketiganya.
Array, objek, dan null
Array menampung campuran nilai apa pun di bawah key integer atau string. Objek adalah instance dari sebuah class; stdClass adalah class kosong bawaan PHP untuk membuat objek dengan cepat, dan (object) mengubah array menjadi objek. null berarti "tidak ada nilai":
Mengecek tipe dengan fungsi is_*
Setiap tipe punya fungsi uji yang mengembalikan true atau false. is_numeric berbeda dari is_int: fungsi ini juga menerima string numerik, dan itulah yang kamu mau saat memeriksa input formulir.
Yang lainnya: is_bool, is_array, is_object, is_null, is_callable, is_iterable, dan $x instanceof ClassName untuk class tertentu.
Type juggling dan strict types
PHP mengonversi tipe secara otomatis saat sebuah operator membutuhkan tipe lain. String numerik yang dipakai dalam aritmetika menjadi angka, dan . mengubah angka menjadi string. String yang sama sekali tidak numerik tidak bisa dijumlahkan, dan PHP 8 melempar TypeError:
Parameter bertipe juga dikonversi, kecuali file-nya diawali declare(strict_types=1);. Dalam mode itu, panggilan dengan tipe skalar yang salah akan gagal alih-alih dikonversi:
Untuk mengonversi dengan sengaja, lakukan cast: (int) "42", (float) "3.5", (string) 10, (bool) "0". Halaman type casting membahas setiap cast dan kasus-kasus tepinya.
Kesalahan umum: membandingkan tipe berbeda dengan ==
Karena == mengonversi sebelum membandingkan, dua nilai dengan tipe berbeda bisa "sama" dengan cara yang memicu bug, seperti "1e1" == "10" (keduanya angka 10) atau null == false. Pakai ===, yang juga mensyaratkan tipe yang sama, kecuali kamu memang menginginkan konversinya:
PHP 8 memperbaiki kasus terburuknya: "abc" == 0 dulu bernilai true dan sekarang false, karena string non-numerik dibandingkan sebagai string. Tabel lengkapnya ada di halaman operator perbandingan.
Pertanyaan yang sering diajukan
Bagaimana cara mengecek tipe variabel di PHP?
var_dump($x) mencetak tipe dan nilainya, misalnya int(5). gettype($x) mengembalikan nama tipe sebagai string ("integer"), dan get_debug_type($x) mengembalikan nama modernnya ("int", atau nama class untuk objek). Untuk menguji satu tipe tertentu, pakai is_int, is_string, is_array, dan fungsi is_* lainnya.
Kenapa gettype mengembalikan "double" untuk float?
Karena alasan sejarah, gettype() melaporkan float sebagai "double" dan integer sebagai "integer". get_debug_type(), yang ditambahkan di PHP 8, mengembalikan "float" dan "int", nama yang sama dengan yang kamu tulis di deklarasi tipe.
Nilai apa saja yang dianggap false di PHP?
Saat dikonversi ke bool, nilai-nilai ini menjadi false: false, 0, 0.0, "", "0", [], dan null. Selain itu semuanya true, termasuk "0.0", " ", dan "false".
Berapa integer terbesar di PHP?
PHP_INT_MAX, yaitu 9223372036854775807 di sistem 64-bit. Menambah melewati batas itu tidak membuatnya berputar kembali: hasilnya menjadi float dan kehilangan presisi.
Apakah PHP bertipe kuat atau lemah?
PHP bertipe dinamis dan, secara bawaan, mengonversi tipe kalau bisa ("10" + 5 bernilai 15). Dengan declare(strict_types=1); di bagian atas file, panggilan ke fungsi bertipe di file itu menolak tipe skalar yang salah dengan TypeError, alih-alih mengonversinya.