PHP #07 - Variabel & Tipe Data (Bag. II)

30 Jul 2020 • ⏳ ~ 11 menit

 

Type Casting

Seperti yang telah dibahas sebelumnya bahwa kita tidak perlu mendeklarasikan tipe data saat membentuk suatu variabel. Hal ini dikarenakan PHP secara otomatis akan menentukan tipe data variabel berdasarkan value (nilai) yang kita tetapkan.

<?php
  $word = "apple";
  var_dump($word);      // Output: string(5) "apple" 

  $number = 50;
  var_dump($number);    // Output: int(50) 

  $decimal = 1.5;
  var_dump($decimal);   // Output: float(1.5)
?>

Namun, pada beberapa keadaan, kita perlu secara manual memaksa variabel memiliki tipe data tertentu sesuai keperluan. Hal ini dapat dicapai menggunakan type casting.

Type casting adalah metode untuk mengubah tipe data suatu variabel menjadi tipe data yang kita perlukan. Hal ini bertujuan untuk memastikan variabel diproses dengan benar.

1. Konversi ke Integer

Untuk melakukan konversi ke tipe data integer, kita dapat menggunakan (int) atau (integer). Terdapat 1 cara lagi untuk mengkonversi tipe data ke integer, yaitu dengan memanfaatkan fungsi intval().

<?php
  var_dump((int) true);              // Output: int(1)
  var_dump((int) false);             // Output: int(0)

  var_dump((int) 0);                 // Output: int(0)
  var_dump((int) 3.6);               // Output: int(3)

  var_dump((integer) "");            // Output: int(0)
  var_dump((integer) "apple");       // Output: int(0)
  var_dump((integer) "0 apples");    // Output: int(0)
  var_dump((integer) "2 apples");    // Output: int(2)

  var_dump(intval([]));              // Output: int(0)
  var_dump(intval([1, 2, 3]));       // Output: int(1)

  var_dump(intval(NULL));            // Output: int(0)
?>
  • Casting dari boolean akan menghasilkan nilai 1 jika true dan 0 jika false.
  • Casting dari float akan menghasilkan nilai dengan menghilangkan angka di belakang floating point (titik) dari bilangan desimal.
  • Casting dari string akan menghasilkan nilai 0 jika string kosong, tidak diawali dengan angka, atau diawali dengan angka nol '0' saja.
  • Casting dari array akan menghasilkan nilai 1 jika memiliki elemen (minimal 1) dan 0 jika tidak memiliki elemen.
  • Casting dari NULL akan selalu menghasilkan nilai 0.

2. Konversi ke Boolean

Untuk melakukan konversi ke tipe data boolean, kita dapat menggunakan (bool) atau (boolean). Terdapat 1 cara lagi untuk mengkonversi tipe data ke boolean, yaitu dengan memanfaatkan fungsi boolval().

<?php
  var_dump((bool) -100);          // Output: bool(true)
  var_dump((bool) 0);             // Output: bool(false)
  var_dump((bool) 100.1);         // Output: bool(true)

  var_dump((boolean) "");         // Output: bool(false)
  var_dump((boolean) "false");    // Output: bool(true)
  var_dump((boolean) "apple");    // Output: bool(true)
  
  var_dump(boolval([]));          // Output: bool(false)
  var_dump(boolval([1, 2, 3]));   // Output: bool(true)

  var_dump(boolval(NULL));        // Output: bool(false)
?>
  • Casting dari integer dan float akan menghasilkan nilai false untuk angka nol '0'; selebihnya menghasilkan nilai true.
  • Casting dari string akan menghasilkan nilai false untuk teks kosong dan string angka nol '0'; selebihnya menghasilkan nilai true.
  • Casting dari array akan menghasilkan nilai true jika memiliki elemen (minimal 1) dan false jika tidak memiliki elemen.
  • Casting dari NULL akan selalu menghasilkan nilai false.

3. Konversi ke Float

Untuk melakukan konversi ke tipe data float, kita dapat menggunakan (float) atau (double). Terdapat 2 cara lagi untuk mengkonversi tipe data ke float, yaitu dengan memanfaatkan fungsi floatval() dan doubleval().

<?php
  var_dump((float) 0);                        // Output: float(0)
  var_dump((float) 100);                      // Output: float(100)

  var_dump((float) true);                     // Output: float(1)
  var_dump((float) false);                    // Output: float(0)

  var_dump((double) "");                      // Output: float(0)
  var_dump((double) "milk");                  // Output: float(0)
  var_dump((double) "0 litres of milk");      // Output: float(0)
  var_dump((double) "2.5 litres of milk");    // Output: float(2.5)
  var_dump((double) "3 litres of milk");      // Output: float(3)
  var_dump((double) "Rp25.000 / pc");         // Output: float(0)

  var_dump(floatval([]));                     // Output: float(0)
  var_dump(floatval([1, 2, 3]));              // Output: float(1)

  var_dump(doubleval(NULL));                  // Output: float(0)
?>
  • Casting dari integer akan menghasilkan nilai yang sama dengan pengubahan tipe data menjadi float.
  • Casting dari boolean akan menghasilkan nilai 1 jika true dan 0 jika false.
  • Casting dari string akan menghasilkan nilai 0 jika string kosong, tidak diawali dengan angka, atau diawali dengan angka nol '0' saja.
  • Casting dari array akan menghasilkan nilai 1 jika memiliki elemen (minimal 1) dan 0 jika tidak memiliki elemen.
  • Casting dari NULL akan selalu menghasilkan nilai 0.

Proses casting ke float memberlakukan pembacaan nilai dari kiri ke kanan. Jika karakter pertama adalah huruf (non-numeric), nilai hasil casting adalah 0. Jika karakter pertama adalah angka (numeric), nilai hasil casting diambil dari karakter (numeric) pertama sampai karakter (numeric) terakhir sebelum adanya karakter huruf.

Misalnya: 913.150DAS1239 akan di-casting menjadi 913.150.

4. Konversi ke String

Untuk melakukan konversi ke tipe data string, kita dapat menggunakan (string) atau "". Terdapat 1 cara lagi untuk mengkonversi tipe data ke string, yaitu dengan memanfaatkan fungsi strval().

<?php
  var_dump((string) 0);           // Output: string(1) "0"
  var_dump((string) 100);         // Output: string(3) "100"

  var_dump((string) true);        // Output: string(1) "1"
  var_dump((string) false);       // Output: string(0) ""

  $floatVal = 3.6;
  var_dump("$floatVal");          // Output: string(3) "3.6"

  var_dump(strval([]));           // Output: string(5) "Array"
  var_dump(strval([1, 2, 3]));    // Output: string(5) "Array"

  var_dump(strval(NULL));         // Output: string(0) ""
?>
  • Casting dari integer dan float akan menghasilkan nilai yang sama dengan pengubahan tipe data menjadi string.
  • Casting dari boolean akan menghasilkan nilai 1 jika true dan "" jika false.
  • Casting dari array akan menghasilkan nilai Array.
  • Casting dari NULL akan selalu menghasilkan nilai "".

5. Konversi ke Array

Untuk melakukan konversi ke tipe data array, kita dapat menggunakan (array). Terdapat 2 cara lagi untuk mengkonversi tipe data ke array, yaitu dengan memanfaatkan fungsi array() atau [].

<?php
  var_dump((array) 0);             // Output: array(1) { [0]=> int(0) }
  var_dump((array) 100);           // Output: array(1) { [0]=> int(100) }

  var_dump((array) true);          // Output: array(1) { [0]=> bool(true) }
  var_dump((array) false);         // Output: array(1) { [0]=> bool(false) }

  var_dump(array(3.6));            // Output: array(1) { [0]=> float(3.6) }

  var_dump(array(""));             // Output: array(1) { [0]=> string(0) "" }
  var_dump(array("apple"));        // Output: array(1) { [0]=> string(5) "apple" }

  var_dump(array(NULL));           // Output: array(1) { [0]=> NULL }

  var_dump([0, true, 3.6, "", NULL]);
  // Output: array(5) { [0]=> int(0) [1]=> bool(true) [2]=> float(3.6) [3]=> string(0) "" [4]=> NULL }
  
  $object = new StdClass;
  $object->first = 1;
  $object->second = 2;
  var_dump((array) $object);
  //Output: array(2) { ["first"]=> int(1) ["second"]=> int(2) }

?>
  • Casting dari tipe data selain object akan dikonversi menjadi array dengan elemen yang diawali dengan index 0, serta value sesuai dengan nilai yang dikonversi.
  • Casting dari object akan dikonversi menjadi array dengan key berupa property object dan value berupa value object.

6. Konversi ke Object

Untuk melakukan konversi ke tipe data object, kita dapat menggunakan (object).

<?php
  var_dump((object) 0);              // Output: object(stdClass)#1 (1) { ["scalar"]=> int(0) }
  var_dump((object) 100);            // Output: object(stdClass)#1 (1) { ["scalar"]=> int(100) }

  var_dump((object) true);           // Output: object(stdClass)#1 (1) { ["scalar"]=> bool(true) }
  var_dump((object) false);          // Output: object(stdClass)#1 (1) { ["scalar"]=> bool(false) }

  var_dump((object) 3.6);            // Output: object(stdClass)#1 (1) { ["scalar"]=> float(3.6) }

  var_dump((object) "");             // Output: object(stdClass)#1 (1) { ["scalar"]=> string(0) "" }
  var_dump((object) "apple");        // Output: object(stdClass)#1 (1) { ["scalar"]=> string(5) "apple" }

  $array = [
    'first' => 1,
    'second' => 2,
  ];

  var_dump((object) $array);         // Output: object(stdClass)#1 (2) { ["first"]=> int(1) ["second"]=> int(2) }

  var_dump((object) NULL);           // Output: object(stdClass)#1 (0) { }
?>

Jika nilai dari tipe data apa pun dikonversi ke object, instance baru dari kelas bawaan stdClass dibentuk.

  • Casting dari tipe data selain array dan NULL akan dikonversi menjadi object dengan property scalar, serta value sesuai dengan nilai yang dikonversi.
  • Casting dari array akan dikonversi menjadi object dengan property berupa key array dan value berupa value array.
  • Casting dari NULL akan dikonversi menjadi object tanpa elemen.

7. Konversi ke NULL

Untuk melakukan konversi ke tipe data NULL, kita dapat melakukan assignment nilai NULL terhadap variabel. Hal ini tidak akan menghapus variabel, tetapi membatalkan nilainya menjadi NULL.

Selain itu, kita juga dapat menggunakan unset() untuk melakukan konversi ke tipe data NULL sekaligus menghapus variabel tersebut, sehingga menjadi undefined.

<?php
  $floatVal = 3.6;
  $floatVal = NULL;
  var_dump($floatVal);
  // Output: NULL

  $boolVal = true;
  unset($boolVal);
  var_dump($boolVal);
  // Notice: Undefined variable: boolVal
  // Output: NULL
  
  $array = [
    'first' => 1,
    'second' => 2,
    'third' => 3,
  ];
  $array['third'] = NULL;
  unset($array['first']);
  var_dump($array);
  // Output: array(2) { ["second"]=> int(2) ["third"]=> NULL }

  $object = new StdClass;
  $object->first = 1;
  $object->second = 2;
  unset($object);
  var_dump($object);
  // Notice: Undefined variable: object
  // Output: NULL
?>

Type Juggling

Pada keadaan tertentu, kita perlu mengoperasikan dua buah variabel dengan tipe data yang berbeda. Dalam PHP, hal ini memungkinkan dengan memanfaatkan type juggling. Saat membandingkan nilai dengan tipe data yang berbeda, PHP akan mengubah tipe data nilai tersebut menjadi bentuk umum terlebih dahulu agar dapat dibandingkan.

Umumnya, type juggling dapat diimplementasikan pada operator aritmatika, fungsi string, serta operator komparasi.

Type Juggling pada Operator Aritmatika

Secara singkat, operator aritmatika adalah operasi matematika yang menghasilkan kalkulasi antara dua buah operand.

Meskipun jarang, kita dapat melakukan operasi matematika terhadap nilai yang bertipe data tertentu dengan nilai yang bertipe data lainnya. Oleh karena itu, type juggling dimanfaatkan untuk mendukung operasi dengan menyelaraskan tipe data kedua nilai tersebut. Untuk penerapannya, kita dapat lihat pada contoh berikut.

<?php
  $variable = "3";
  // Variabel $variable diinisialisasi dengan nilai "3"
  // PHP secara otomatis menetapkan tipe data variabel $variable sebagai string
  echo $variable . " -> " . gettype($variable);

  $variable *= 4;
  // Variabel $variable dikalikan dengan angka 4
  // PHP secara otomatis menetapkan tipe data variabel $variable sebagai integer
  echo $variable . " -> " . gettype($variable);

  $variable = $variable * 0.5;
  // Variabel $variable dikalikan dengan angka 0.5
  // PHP secara otomatis menetapkan tipe data variabel $variable sebagai float
  echo $variable . " -> " . gettype($variable);

  $variable += "3 buah";
  // Variabel $variable ditambahkan dengan string "3 buah"
  // Operasi dengan string ini akan di-casting menjadi integer dengan nilai 3
  // PHP secara otomatis menetapkan tipe data variabel $variable sebagai float
  echo $variable . " -> " . gettype($variable);

  $variable -= "...2";
  // Variabel $variable dikurangkan dengan string "...2"
  // Operasi dengan string ini akan di-casting menjadi integer dengan nilai 0
  // PHP secara otomatis menetapkan tipe data variabel $variable sebagai float
  echo $variable . " -> " . gettype($variable);

  $variable = 10 - "3 tali";
  // Variabel $variable diinisialisasi dengan nilai 10 - "3 tali"
  // Operasi dikurangi dengan string "3 tali" akan di-casting menjadi integer dengan nilai 3
  // PHP secara otomatis menetapkan tipe data variabel $variable sebagai integer
  echo $variable . " -> " . gettype($variable);
?>
3 -> string

12 -> integer

6 -> double

Notice: A non well formed numeric value encountered
9 -> double

Warning: A non-numeric value encountered
9 -> double

Notice: A non well formed numeric value encountered
7 -> integer

Berdasarkan contoh di atas, kita dapat mengetahui bahwa ketika integer dioperasikan dengan float (double), akan menghasilkan nilai bertipe data float (double). Begitu juga ketika integer atau float (double) dioperasikan dengan string, terjadi operasi terhadap angka pada awalan string dan menghasilkan nilai bertipe data integer atau float (double). Bila tidak terdapat angka pada awalan string, string dianggap bernilai 0. Hal ini terjadi karena PHP secara otomatis melakukan type casting sesuai ketentuan yang ada.

Tentunya, ketika kita berusaha untuk mengoperasikan nilai bertipe data angka (numeric) dengan nilai bertipe data teks (string / non-numeric), kita akan mendapatkan peringatan.

Type Juggling pada Fungsi String

Terkadang, kita perlu menghubungkan nilai bertipe data lain dalam penerapan string maupun fungsinya, seperti menggabungkan nilai bertipe data angka (numeric) dengan nilai bertipe data string. Tentunya dalam penerapan tersebut, type juggling secara otomatis diterapkan. Mari kita lihat beberapa penerapannya pada contoh berikut.

<?php
  $total = 209000;
  $total = 'Total : ' .  $total;
  echo $total;

  echo "Terdapat " . 1 . " liter jus. Eh, " . 2.1 . " liter.";

  $word = 'dari';
  echo "Saya $word Bali.";

  $word[3] = 2;
  echo "Pada dinding, tertulis \"$word\".";

  echo strlen(107);

  echo strrev(20.8);
?>
Total : 209000

Terdapat 1 liter jus. Eh, 2.1 liter.

Saya dari Bali.

Pada dinding, tertulis "dar2".

3

8.02

Jika kita menampilkan hasil concatenation antara string dan angka (integer atau float), kita akan mendapatkan hasil dalam bentuk string sebagai bentuk penggabungan semua nilai. Sebagai tambahan, string sendiri merupakan array of char. Oleh karena itu, kita dapat mengganti nilai tertentu dalam string dengan menggunakan index layaknya array.

Pada contoh, kita dapat melihat nilai bertipe data angka (numeric) yang diterapkan dalam fungsi string, seperti strlen() dan strrev(). Padahal, fungsi string tersebut hanya menerima parameter berupa string. Pada keadaan inilah type juggling secara otomatis mengubah tipe data angka tersebut menjadi string agar dapat diproses dalam fungsi-fungsi string tersebut.

  • Fungsi strlen() merupakan fungsi yang mengembalikan nilai berupa panjang karakter string.
  • Fungsi strrev() merupakan fungsi yang mengembalikan nilai berupa string dalam urutan terbalik.

Type Juggling pada Operator Komparasi

Secara singkat, operator komparasi berfungsi untuk membandingkan dua nilai yang akan mengembalikan nilai berupa true jika sesuai dengan operator komparasinya, dan false jika sebaliknya. Beberapa operator komparasi juga dapat membandingkan nilai hingga tipe data nilainya sekaligus.

Biasanya, nilai-nilai yang akan dibandingkan harusnya memiliki tipe data yang sama dan sesuai dengan keperluan dari operator komparasi itu sendiri. Untuk menangani kendala demikian, type juggling dapat kita manfaatkan. Mari kita lihat contoh penerapannya.

<?php
  $stringThree = '3';
  $integerThree = 3;
  $stringSeven = '7';
  $mixedVariable = "2 and ?";

  var_dump($stringThree < $stringSeven);      # Output: bool(true)
  var_dump($stringThree == $integerThree);    # Output: bool(true)
  var_dump($stringThree === $integerThree);   # Output: bool(false)
  var_dump(2 == $mixedVariable);              # Output: bool(true)
  var_dump(1 == $mixedVariable);              # Output: bool(false)
?>

Pada contoh di atas, terdapat beberapa operator komparasi yang biasanya digunakan untuk membandingkan nilai berupa angka (numeric). Oleh karena itu, fitur type juggling berupaya untuk membentuk nilai dengan tipe numeric dari nilai berupa string, sehingga nilai-nilai tersebut kemudian dapat dibanding.

Pada contoh di atas, terdapat operator komparasi equal (==) yang merupakan loose comparison serta identical (===) yang merupakan strict comparison. Kedua operator tersebut sama-sama membandingkan persamaan nilai pada kedua variabel. Hanya saja, strict comparison menekankan kepada persamaan nilai dan juga tipe data kedua variabel.

PHP

PHP #08 - Variabel Global dan Superglobal

PHP #06 - Variabel & Tipe Data (Bag. I)

comments powered by Disqus