Kodealgo

Type Juggling PHP

PHP tidak memerlukan definisi tipe eksplisit saat kita mendeklarasikan variabel, tipe data dari sebuah variabel bergantung nilainya. Artinya, jika kita menugaskan string ke variabel misalnya $a maka variabel tersebut akan bertipe string, jika setelah itu kita menugaskan tipe data lain misalnya integer, maka tipe $a akan berubah menjadi integer.

Dalam konteks tertentu PHP mencoba mengonversi secara otomatis tipe nilai ke nilai lain atau melakukan type juggling, misalnya saat kita menggunakan operator aritmatika dimana operan harus bertipe integer atau floating-point, jika tidak maka salah satu atau kedua operan akan dikonversi ke nilai yang sesuai.

Mari kita lihat contoh berikut, dimana kami menjumlahkan boolean true dengan false.

var_dump(true + false); // int(1)

Contoh diatas kami menggunakan operator aritmatika penjumlahan (+), operator tersebut akan membuat kedua operan masuk dalam konteks numerik, karena kita tidak menggunakan nilai numerik, PHP akan secara otomatis mengkonversi true ke 1 dan false ke 0, oleh karena itu menghasilkan 1.

Perliaku diatas disebut type juggling dalam konteks numerik, ada banyak konteks yang perlu kita ketahui. Berikut beberapa konteks type juggling di PHP:

  1. Konteks Numerik
  2. Konteks String
  3. Konteks Logis
  4. Konteks Integral dan String
  5. Konteks Perbandingan
  6. Konteks Fungsi

Konteks Numerik

Konteks numerik adalah konteks saat menggunakan operator aritmatika, dalam konteks ini jika salah satu operan bertipe float (atau tidak dapat ditafsirkan sebagai integer), kedua operan akan ditafsirkan sebagai float dan hasilnya menjadi float.

Jika bukan float, operan akan ditafsirkan sebagai integer dan menghasilkan integer. Jika salah satu operan tidak dapat diinterpretasikan maka kesalahan TypeError akan dilempar.

Mari kita buktikan. Contoh berikut kita menggunakan operator aritmatika penjumlahan (+) untuk menjumlahkan float (bilangan pecahan) dengan integer (bilangan bulat), dan menjumlahkan float dengan float.

$hasil1 = 2.5 + 2; // float + integer
$hasil2 = 2.5 + 2.5; // float + float

var_dump($hasil1); // float(4.5)
var_dump($hasil2); // float(5)

Kedua contoh di atas menghasilkan nilai floating point, seperti yang telah disebutkan sebelumnya, dalam konteks numerik, jika salah satu atau kedua operan bertipe float maka akan menghasilkan float meskipun jika dikalkulasikan menghasilkan bilangan bulat seperti contoh diatas pada variabel hasil2, itu menghasilkan 5 tapi tipe yang dikembalikan adalah float.

Bagaima jika string digunakan dalam konteks numerik? jika string dapat diinterpretasikan sebagai integer misalnya '5' atau float misalnya '2.5' maka akan dikonversi ke tipe numerik yang sesuai. Selain dari, misalnya string kosong dan string non numerik, PHP akan mengembalikan kesalah TypeError.

$hasil1 = '2' + 2;
$hasil2 = '2.5' + 2;
// $hasil3 = 'hello' + 2; // PHP Fatal error:  Uncaught TypeError:

var_dump($hasil1); // int(4)
var_dump($hasil2); // float(4.5)

Konteks String

Konteks string adalah konteks saat menggunkaan echo, print, interpolasi string, atau operator penggabung string. Dalam konteks ini nilai akan ditafsirkan sebagai string.

Mari kita coba konteks string saat menggunkaan operator penggabung string.

$hasil = 'hello world ' . 2;

var_dump($hasil); // string(13) "hello world 2"

Cotnoh di atas kami menggunakan operan string dan integer, hasilnya menjadi string.

Konteks Logis

Konteks logis adalah konteks saat menggunakan conditional statement, operator ternary, atau operator logika. Dalam konteks ini, nilai akan diinterpretasikan sebagai boolean.

Mari kita coba konteks logis saat menggunakan operator logika.

$hasil1 = '' && true;
$hasil2 = 1 && true;

var_dump($hasil1); // bool(false)
var_dump($hasil2); // bool(true)

Contoh pertama di atas ($hasil1) menghasilkan nilai bool(false) karena string kosong yang dikonversi ke boolean akan menghasilkan false, jadi false && true menghasilkan false.

Contoh kedua ($hasil2) kita mengguankan integer 1 sebagai operan, jika nilai tersebut dikonversi ke boolean, ini akan menghasilkan nilai true, jadi true && true menghasilkan true.

Konteks Integral dan String

Konteks integral dan string adalah konteks saat menggunkaan operator bitwise. Dalam konteks ini, jika semua operan bertipe string, hasilnya berupa string. Jika bukan string, operan akan ditafsirkan sebagai integer dan menghasilkan integer.

Contoh:

$hasil = 23 >> 2;

var_dump($hasil); // int(5)

Konteks Perbandingan

Konteks perbandingan adalah konteks saat menggunakan operator perbandingan. Dalam konteks ini, jika kedua operan bertipe string atau salah satu bertipe null, maka akan dikonversi menjadi string kosong.

Selain itu, jika salah satu operan bernilai boolean atau null, makan kedua operan akan dikonversi ke boolean.

Contoh:

$hasil1 = null == '';
$hasil2 = true == 'anything';

var_dump($hasil1); // bool(true)
var_dump($hasil2); // bool(true)

Konteks Fungsi

Konteks fungsi adalah konteks saat nilai diteruskan ke parameter, properti, dikembalikan dari fungsi yang tipenya ditentukan.

Perilakunya mirip seperti type casting, nilai akan dipaksa berubah ke tipe yang sesuai.

Mari kita lihat contoh berikut:

function hello(): int {
  return true;
}

var_dump(hello()); // int(1)

Kami menentukan tipe pengembalian fungsi pada contoh di atas yaitu int (integer), tapi fungsi tersebut mengembalikan boolean true, maka nilai boolean yang dikembalikan akan dikonversi sesuai tipe pengembaliannya yaitu integer, oleh karena itu fungsi diatas mengembalikan nilai int(1), karena jika true dikonversi ke integer maka akan menghasilkan integer 1.