Pada Chapter Type Juggling
kita sudah melihat PHP mengonversi tipe secara otomatis mengikuti konteks operasi. Konversi otomatis tersebut praktis, tetapi kadang kita perlu memegang kendali penuh: mengubah input pengguna dari $_GET yang selalu berupa string menjadi angka, atau memastikan sebuah nilai dihitung sebagai boolean. Mekanisme konversi eksplisit ini bernama type casting. Pada Chapter ini kita akan membedah enam operator cast beserta perilaku detailnya, jebakan pembulatan yang menyertainya, dan fungsi konversi alternatif seperti intval() dan settype().
Konversi Eksplisit dengan Operator Cast #
Operator cast ditulis dengan menuliskan nama tipe tujuan di dalam tanda kurung, tepat sebelum nilai yang ingin dikonversi — misalnya (int) $nilai. PHP menyediakan enam operator cast yang menjangkau tipe-tipe yang paling sering kita pakai sehari-hari:
| Operator | Mengubah ke | Alias |
|---|---|---|
(int) | integer | (integer) |
(float) | float | (double), (real) |
(string) | string | — |
(bool) | bool | (boolean) |
(array) | array | — |
(object) | object | — |
Mari kita lihat keenam operator tersebut bekerja dalam satu program:
<?php
var_dump((int) "42");
var_dump((float) "3.14");
var_dump((string) 99);
var_dump((bool) "");
var_dump((array) "Budi");
var_dump((object) ["kota" => "Bandung"]);Output yang Dihasilkan:
int(42)
float(3.14)
string(2) "99"
bool(false)
array(1) {
[0]=>
string(4) "Budi"
}
object(stdClass)#1 (1) {
["kota"]=>
string(7) "Bandung"
}Perhatikan bahwa setiap baris menghasilkan tipe yang berbeda dari nilai asalnya: string "42" menjadi integer, string "3.14" menjadi float, integer 99 menjadi string, string kosong menjadi false, lalu dua baris terakhir membungkus nilai menjadi array dan object. Hasil cast adalah nilai baru — variabel asal tidak berubah sama sekali, sebuah sifat yang akan kita manfaatkan pada bagian Fungsi Konversi nanti.
Cast ke Integer Memotong, Bukan Membulatkan #
Konversi dari float ke integer adalah sumber kebingungan klasik. Operator (int) tidak membulatkan ke nilai terdekat; operator tersebut memotong bagian pecahan (truncate) ke arah nol, sehingga 54999.75 menjadi 54999 dan -54999.75 menjadi -54999 (bukan -55000):
<?php
$harga = 54999.75;
var_dump((int) $harga);
var_dump((int) -54999.75);
var_dump((int) round($harga));Output yang Dihasilkan:
int(54999)
int(-54999)
int(55000)Baris terakhir menunjukkan solusinya: bila yang kita butuhkan adalah pembulatan ke nilai terdekat, panggil round() terlebih dahulu baru lakukan cast. Angka 54999.75 dibulatkan menjadi 55000.0 oleh round(), lalu di-cast menjadi integer 55000.
Cast dari string ke integer mengikuti aturan string numerik yang dibahas pada Chapter Strings
: bagian awal yang berupa angka diambil, dan string yang tidak diawali angka menjadi 0. Cast dari true menjadi 1, false dan null menjadi 0.
Cast ke String dan Bool #
Konversi ke string memiliki tiga kasus khusus yang perlu dihafal: true menjadi "1", sedangkan false dan null keduanya menjadi string kosong "". Angka diubah ke representasi desimalnya secara natural:
<?php
var_dump((string) 42, (string) 3.5, (string) true, (string) false, (string) null);Output yang Dihasilkan:
string(2) "42"
string(3) "3.5"
string(1) "1"
string(0) ""
string(0) ""Cast ke bool adalah kebalikan yang lebih ramah: hampir semua nilai menjadi true, dan hanya segelintir nilai yang menjadi false. Tabel kebenaran (truth table) berikut merangkum kasus-kasus pentingnya:
<?php
$uji = [
[0, "integer 0"],
[5, "integer 5"],
[0.0, "float 0.0"],
["", 'string kosong ""'],
["0", 'string "0"'],
["0.0", 'string "0.0"'],
["belajar", 'string "belajar"'],
[[], "array kosong"],
[[0], "array berisi 0"],
];
foreach ($uji as $kasus) {
printf("%-22s => %s\n", $kasus[1], (bool) $kasus[0] ? "true" : "false");
}Output yang Dihasilkan:
integer 0 => false
integer 5 => true
float 0.0 => false
string kosong "" => false
string "0" => false
string "0.0" => true
string "belajar" => true
array kosong => false
array berisi 0 => trueYang sering menjebak adalah dua baris string: "0" bernilai false, tetapi "0.0" bernilai true — hanya string kosong dan string "0" yang dianggap kosong. Demikian pula array: array yang tidak memiliki elemen apa pun bernilai false, tetapi array yang berisi 0 sekalipun tetap bernilai true. Nilai false dalam konteks boolean juga lazim disebut falsy, dan aturan lengkapnya dibahas pada Chapter Booleans
.
Cast ke Array dan Object #
Cast (array) membungkus nilai skalar menjadi array satu elemen berindeks 0. Dua pengecualian penting: array yang sudah berupa array tidak berubah apa pun, dan null justru menjadi array kosong:
<?php
var_dump((array) 42);
var_dump((array) null);
$warna = ["merah", "kuning"];
var_dump((array) $warna);
$pengguna = (object) ["nama" => "Budi", "umur" => 17];
var_dump($pengguna->nama, $pengguna->umur);
$bungkus = (object) 3.14;
var_dump($bungkus->scalar);Output yang Dihasilkan:
array(1) {
[0]=>
int(42)
}
array(0) {
}
array(2) {
[0]=>
string(5) "merah"
[1]=>
string(6) "kuning"
}
string(4) "Budi"
int(17)
float(3.14)Cast (object) pada array menghasilkan object stdClass yang kunci array-nya menjadi property — $pengguna->nama berisi "Budi" dan $pengguna->umur berisi 17. Sebaliknya, cast (object) pada nilai skalar menghasilkan stdClass dengan satu property bernama scalar yang menyimpan nilai asalnya, seperti terlihat pada $bungkus->scalar yang bernilai 3.14. Kedua arah konversi ini berguna saat berhadapan dengan fungsi yang mensyaratkan tipe tertentu — misalnya fungsi count() yang hanya menerima array atau object Countable.
Fungsi Konversi dan settype() #
Selain operator cast, PHP menyediakan fungsi konversi: intval(), floatval(), strval(), dan boolval(). Berbeda dengan operator cast yang menghasilkan nilai baru, settype() justru mengubah variabel itu sendiri di tempat dan mengembalikan true bila berhasil:
<?php
$hargaTeks = "15000";
var_dump(settype($hargaTeks, "integer"));
var_dump($hargaTeks);
var_dump(intval("42"), intval("52", 8), intval("1a", 16));
var_dump(floatval("3.14"));
var_dump(strval(99));
var_dump(boolval("0"), boolval("php"));Output yang Dihasilkan:
bool(true)
int(15000)
int(42)
int(42)
int(26)
float(3.14)
string(2) "99"
bool(false)
bool(true)Mari kita bedah keluaran di atas: settype() mengembalikan bool(true) dan variabel $hargaTeks kini berisi integer 15000 — variabel yang sama berubah tipe. Fungsi intval("52", 8) menghasilkan 42 karena argumen kedua menyatakan basis bilangan: "52" dibaca sebagai bilangan oktal (5×8+2). Demikian pula intval("1a", 16) membaca "1a" sebagai heksadesimal menjadi 26 — fitur yang tidak dimiliki operator (int).
Sebagai penutup, mari kita rangkai semuanya dalam skenario nyata: mengolah input formulir yang datang sebagai string:
<?php
$inputHarga = "125000.5";
$harga = (float) $inputHarga;
$jumlah = (int) "3";
$total = $harga * $jumlah;
echo "Total: Rp", $total, "\n";
echo "Dibulatkan ke rupiah: Rp", (int) round($total), "\n";Output yang Dihasilkan:
Total: Rp375001.5
Dibulatkan ke rupiah: Rp375002Nilai "125000.5" di-cast ke float karena harga dapat memuat pecahan, sedangkan "3" cukup di-cast ke integer karena jumlah barang selalu bulat. Perkalian float dengan integer menghasilkan float 375001.5, lalu round() membulatkannya sebelum cast terakhir menghasilkan rupiah utuh 375002.
Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh Chapter ini dalam satu program yang dapat langsung Anda jalankan.
Ringkasan #
Type casting memberi kendali penuh atas konversi tipe: (int) memotong float ke arah nol, (string) mengubah true menjadi "1" serta false/null menjadi string kosong, (array) membungkus skalar menjadi array satu elemen, dan (object) mengubah array menjadi stdClass. Fungsi intval() menambahkan kemampuan membaca basis bilangan, sementara settype() mengubah variabel di tempat. Namun sebelum melempar sebuah nilai ke tipe lain, langkah pertama yang lebih aman adalah memastikan tipe apa yang sedang kita pegang — kemampuan memeriksa tipe itulah materi Chapter berikutnya.
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 Type Casting dalam satu program utuh.
// Jalankan dengan: php contoh.php
// 1. Operator cast dasar
var_dump((int) "42");
var_dump((float) "3.14");
var_dump((string) 99);
var_dump((bool) "");
// 2. (int) pada float memotong, bukan membulatkan
$harga = 54999.75;
var_dump((int) $harga);
var_dump((int) round($harga));
// 3. Cast ke array dan object
var_dump((array) "Budi");
$pengguna = (object) ["nama" => "Budi", "umur" => 17];
var_dump($pengguna->nama, $pengguna->umur);
// 4. settype() mengubah variabel di tempat
$hargaTeks = "15000";
settype($hargaTeks, "integer");
var_dump($hargaTeks);
var_dump(intval("52", 8));
// 5. Skenario nyata: mengolah input formulir
$inputHarga = "125000.5";
$total = (float) $inputHarga * (int) "3";
echo "Total: Rp", $total, "\n";
echo "Dibulatkan ke rupiah: Rp", (int) round($total), "\n";