Sepanjang Section ini kita bermain dengan mekanisme: variabel menyimpan nilai, declare(strict_types=1) menegakkan tipe pada pemanggilan fungsi. Namun pertanyaan besarnya belum terjawab: tipe apa saja sebenarnya yang dimiliki PHP, dan bagaimana semuanya tersusun? Chapter ini menarik kamera ke belakang dan memetakan type system PHP secara menyeluruh — dari kategori tipe bawaan, alat untuk memeriksa tipe saat runtime, hingga daftar lengkap tempat deklarasi tipe boleh muncul. Peta ini akan menjadi kompas Anda saat Section berikutnya membongkar tiap tipe satu per satu.
Peta Kategori Tipe #
PHP mengelompokkan tipe bawaannya ke dalam beberapa kategori. Tabel berikut merangkum keseluruhannya sekaligus menunjuk chapter yang membahas tiap tipe secara mendalam:
| Kategori | Anggota | Ciri utama |
|---|---|---|
| Skalar | bool, int, float, string | satu nilai sederhana; lolos uji is_scalar() |
| Komposit | array, object | mengumpulkan banyak nilai dalam satu wadah |
| Pegangan eksternal | resource | referensi ke sumber daya luar: berkas, koneksi |
| Kosong | null | menandai “tidak ada nilai” |
| Khusus nilai balik | void, never | menerangkan kelakuan nilai balik fungsi |
| Nilai tunggal | true, false | tipe yang berisi tepat satu nilai (sejak PHP 8.2) |
| Alias tipe | mixed, iterable | nama ringkas untuk gabungan tipe lain |
| Callable | callable | nilai yang dapat dipanggil: string nama fungsi, closure |
| Buatan sendiri | class, interface, enum | tipe yang didefinisikan lewat kode Anda |
Dua baris terakhir pantas dijelaskan sedikit. callable dan iterable adalah tipe deklarasi: keduanya tidak punya wujud nilai tersendiri, melainkan mendeskripsikan kelompok nilai yang diizinkan — iterable, misalnya, adalah alias untuk Traversable|array, dan mixed adalah alias untuk gabungan seluruh tipe lain termasuk null. Class, interface, dan enum disebut tipe buatan sendiri (user-defined types): begitu Anda menulis class Produk, nama Produk resmi menjadi tipe baru yang bisa dipakai pada deklarasi parameter maupun nilai balik.
Memeriksa Tipe saat Runtime #
Dinamika PHP membuat kita sering perlu bertanya saat program berjalan: “tipe apa isi variabel ini?”. Tiga alat utama menjawabnya — gettype(), get_debug_type(), dan keluarga fungsi is_*:
<?php
$contoh = [42, 3.14, "teks", true, null, [1, 2, 3], new stdClass()];
foreach ($contoh as $nilai) {
echo str_pad(gettype($nilai), 10), "| ", str_pad(get_debug_type($nilai), 9),
"| skalar: ", var_export(is_scalar($nilai), true), "\n";
}Output yang Dihasilkan:
integer | int | skalar: true
double | float | skalar: true
string | string | skalar: true
boolean | bool | skalar: true
NULL | null | skalar: false
array | array | skalar: false
object | stdClass | skalar: falseMari kita baca tabel keluarannya. Kolom pertama berasal dari gettype(), yang memakai nama warisan: integer, double, dan NULL dengan huruf kapital — nama-nama ini diwariskan dari era PHP lama dan tidak bisa diubah demi kompatibilitas. Kolom kedua berasal dari get_debug_type() yang hadir sejak PHP 8.0 dengan nama modern (int, float, null) dan nama class yang sebenarnya untuk object — inilah alat yang dianjurkan untuk pesan error dan logging. Kolom ketiga menguji is_scalar(): hanya int, float, string, dan bool yang lolos, sedangkan null, array, dan object gagal meskipun semuanya bernilai tunggal secara logika.
Keluarga is_* memberikan pertanyaan yang lebih tepat sasaran daripada “tipe apa” — yaitu “apakah nilai ini termasuk tipe X”:
<?php
var_dump(
is_int(42),
is_int("42"),
is_float(3.14),
is_string("teks"),
is_bool(true),
is_null(null),
is_array([]),
is_object(new stdClass()),
is_callable("strlen"),
is_iterable([1, 2])
);Output yang Dihasilkan:
bool(true)
bool(false)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)Sembilan jawaban true dan satu false — dan justru is_int("42") yang false itulah pelajarannya: pemeriksa tipe melihat tipe sesungguhnya, bukan tipe yang mungkin setelah konversi. Angka 42 dalam string tetap string, sebagaimana telah kita lihat ketika mode ketat menolaknya. Pemakaian is_* untuk mempersempit type di dalam fungsi dibahas khusus pada Chapter Type Checking
.
Dynamic Typing dengan Jaring Pengaman Bertahap #
PHP adalah bahasa ber-dynamic typing: variabel tidak bertipe, tetapi nilainya bertipe — variabel yang sama boleh berisi int sekarang dan string lima baris kemudian. Pemeriksaan tipe dilakukan saat program berjalan, bukan sebelum dijalankan seperti pada bahasa statis murni. Model ini luwes untuk skrip kecil, namun makin berisiko seiring bertambahnya ukuran kode.
Karena itulah PHP modern tumbuh menjadi bahasa ber-gradual typing (pengetikan bertahap): Anda memilih sendiri seberapa banyak jaring pengaman yang dipasang. Deklarasi tipe pada parameter dan nilai balik bersifat opsional, declare(strict_types=1) menaikkan penegakan dari “coba konversi dulu” menjadi “tolak yang tidak tepat”, dan property class pun dapat dideklarasikan tipenya. Tim yang memegang kode besar biasanya memasang seluruh jaring sekaligus; skrip sekali-jalan boleh membiarkannya lepas.
Di Mana Deklarasi Tipe Boleh Muncul #
Empat lokasi menerima type declaration — parameter, nilai balik, property, dan class constant. Contoh berikut memperlihatkan keempatnya sekaligus:
<?php
class Konfig
{
public const string VERSI = "1.0";
public ?int $batasStok = null;
public function __construct(private string $nama)
{
}
public function label(): string
{
return $this->nama . " v" . self::VERSI;
}
}
function total(int $jumlah, float $harga): float
{
return $jumlah * $harga;
}
var_dump(total(2, 25000.5));
echo (new Konfig("Toko Budi"))->label(), "\n";Output yang Dihasilkan:
float(50001)
Toko Budi v1.0Mari kita petakan lokasinya:
public const string VERSI = "1.0";— class constant bertipe hadir sejak PHP 8.3; konstanta biasa di luar class (define(),constglobal) tidak dapat dideklarasikan tipenya.public ?int $batasStok = null;— property bertipe nullable sejak PHP 7.4; nilainya dijaga penugasan berikutnya.private string $namapada constructor — parameter ber-typed property promotion (promosi deklarasi property lewat parameter), danlabel(): stringadalah deklarasi nilai balik.function total(int $jumlah, float $harga): float— parameter dan nilai balik fungsi biasa, lokasi paling klasik sejak PHP 7.0.
Selain lokasi, tipe juga dapat disusun menjadi bentuk komposit: ?T untuk nullable, T|U untuk union, dan T&U untuk intersection. Ketiganya dibahas pada chapter khusus di Section ini — Nullable Types
, Union Types
, dan Intersection Types
— lalu diperdalam pada Section Type System dan Static Analysis.
Berkas contoh.php pada bagian bawah halaman merangkum alat-alat Chapter ini dalam satu program yang dapat langsung Anda jalankan.
Ringkasan #
Type system PHP terbagi menjadi tipe skalar, komposit, resource, null, tipe khusus nilai balik, tipe nilai tunggal, alias, callable, dan tipe buatan sendiri. Alat gettype(), get_debug_type(), dan keluarga is_* memeriksa tipe saat runtime, sementara dynamic typing PHP diperkuat secara bertahap lewat deklarasi pada parameter, nilai balik, property, dan class constant. Dengan peta di tangan, kita siap memasuki Section berikutnya yang membongkar tiap tipe satu per satu — dimulai dari yang paling mendasar: integer.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
// contoh.php — rangkuman Chapter PHP Type System.
// Jalankan dengan: php contoh.php
// gettype() melaporkan tipe runtime dengan nama lama ("integer", "double").
$contoh = [42, 3.14, "teks", true, null, [1, 2, 3], new stdClass()];
foreach ($contoh as $nilai) {
echo str_pad(gettype($nilai), 10), "=> ", var_export(is_scalar($nilai), true), "\n";
}
// Keluarga fungsi pemeriksa tipe.
var_dump(
is_int(42),
is_float(3.14),
is_string("teks"),
is_bool(true),
is_null(null),
is_array([]),
is_object(new stdClass()),
is_callable('strlen'),
is_iterable([1, 2])
);
// mixed: parameter dan nilai balik boleh tipe apa pun.
function proses(mixed $data): mixed {
return $data;
}
var_dump(proses(null), proses(7), proses([1, 2]));
// Type declaration pada property, parameter, dan return.
class Produk {
public string $nama = "tanpa nama";
public float $harga = 0.0;
public ?int $stok = null;
}
$produk = new Produk();
$produk->nama = "Kopi Gayo";
$produk->harga = 85000.0;
$produk->stok = 12;
function ringkas(Produk $item): string {
return "$item->nama: Rp" . number_format($item->harga, 0, ',', '.');
}
echo ringkas($produk), "\n";