Inilah 9 Fitur Keren PHP 7.1.0



Re:Code- Beberapa pekan yang lalu, ada kabar baik yang datang dari tim pengembang bahasa pemrograman PHP. Kabar baik itu tentang rilisnya PHP versi terbaru. Ya, PHP versi 7.1.0 akhirnya dirilis dengan fitur-fitur baru yang keren. Yuk kita intip apa saja fitur baru PHP 7.1.0!



[1] Nullable Types

PHP 7 menambahkan deklarasi tipe untuk parameter dan return type. Akan tetapi, tampaknya masih terasa ada yang kurang! Ya, kurang Nullable type.. Yang akhirnya bisa kita gunakan di PHP 7.1.0. Nullable type digunakan untuk mengambil return type antara tipe tertentu atau null. Nah, di bawah ini contoh penggunaannya.

 function sum(int $a, int $b): ?int  
 {  
   return $a + $b;  
 }  


Di fungsi di atas boleh jadi return-nya itu menjadi sebuah integer atau nilai null, so, jika ada yang salah pada logika fungsi kita bisa memakai null sebagai return type. Oh iya, kita bisa memakai nullable type untuk argument juga lho! Ini dia contoh penggunaannya.

 function sum(?int $a, ?int $b): ?int  
 {  
   if ($a == null || $b == null) {  
     return null;  
   }  
   
   return $a + $b;  
 }  


Hal yang biasanya tidak terduga adalah saat pemanggilan fungsi tanpa argument akan menyebabkan throw exception.

 var_dump(sum(null, null)); // NULL  
 var_dump(sum()); // throw ArgumentCountError exception  


Itu artinya, kita harus menentukan argument ketika mereka tidak punya nilai default secara eksplisit.

Hal lain yang perlu kita ingat adalah ketika override atau implementasi methods, kita tidak dapat menambahkan nullable type sebagai return type, akan tetapi kita boleh menghapusnya. Dan sebaliknya, untuk argument malah bisa ditambahkan, tetapi kita tidak dapat menghapus nullable type dari argumen. Kita bisa lihat dalam code di bawah ini:

 interface Fooable {  
   function foo(): ?Fooable;  
 }  
 interface StrictFooable extends Fooable {  
   function foo(): Fooable; // valid  
 }  
   
 interface Fooable {  
   function foo(): Fooable;  
 }  
 interface LooseFooable extends Fooable {  
   function foo(): ?Fooable; // invalid  
 }  



[2] Destructuring Arrays

Biasanya kita menggunakan cara ini saat destructure sebuah array.

 list($a, $b, $c) = [1, 2, 3];  
 var_dump($a, $b, $c); // int(1) int(2) int(3)  


Tapi, kalau kita coba cara di atas, kita akan gagal. Kenapa? karena kita tidak dapat menentukan key untuk mengekstrak dan juga saat sebuah fungsi mencoba untuk menggunakan index key.

 list($a, $b, $c) = ["a" => 1, "b" => 2, "c" => 3];  
 var_dump($a, $b, $c); // NULL NULL NULL  


Nah, RFC sekarang menyediakan kontrol terhadap destructure sebuah array. Contoh code di atas dapat diubah menjadi:

 list("a" => $a, "b" => $b, "c" => $c) = ["a" => 1, "b" => 2, "c" => 3];  
 var_dump($a, $b, $c); // int(1) int(2) int(3)  


Fungsi list sekarang bisa menerima key untuk destructure array, dan karena ini sering digunakan, ada sintaks baru yang dikenalkan juga lho! Ini dia contohnya:

 ["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3];  
 var_dump($a, $b, $c); // int(1) int(2) int(3)  


Gimana, menarik bukan? dan ini juga dapat digunakan pada multidimensional array.

 [[$a, $b], [$c, $d]] = [[1, 2], [3, 4]];  
 var_dump($a, $b, $c, $d); // int(1) int(2) int(3) int(4)  
   
 [["b" => $b], ["c" => $c]] = [["a" => 1, "b" => 2], ["c" => 3, "d" => 4]];  
 var_dump($b, $c); // int(2) int(3)  


[3] Iterable Type

Iterable pseudo-type ditambahkan untuk join sebuah array dengan tipe primitif dan traversable interface yang digunakan untuk membuat nilai iterable. Nah, di bawah ini adalah contoh codenya:

 // PHP 5.6  
   
 function dump(array $items)  
 {  
   var_dump($items);  
 }  
   
 dump([2, 3, 4]);  
 dump(new Collection());  
 array(3) {  
  [0]=>  
  int(2)  
  [1]=>  
  int(3)  
  [2]=>  
  int(4)  
 }  
   
 Catchable fatal error: Argument 1 passed to dump() must be of the type array, object given...  


Tapi dalam kasus ini, fungsi tidak menerima sebuah nilai iterable dan akan menyebabkan throw error. Dengan perubahan baru memungkinkan kita untuk menggunakan iterable untuk mendeskripsikan sebuah nilai iterable.

 // PHP 5.6  
   
 function dump(array $items)  
 {  
   var_dump($items);  
 }  
   
 dump([2, 3, 4]);  
 dump(new Collection());  


 array(3) {  
  [0]=>  
  int(2)  
  [1]=>  
  int(3)  
  [2]=>  
  int(4)  
 }  
   
 Catchable fatal error: Argument 1 passed to dump() must be of the type array, object given...  


[4] Closure dari Callable Function

Methods fromCallable baru menyediakan sebuah perfoma dan sebuah cara yang menarik dalam mebuat Closure object dari callable. Nah, di bawah ini contohnya:

 $callback = Closure::fromCallable([$this, 'fn']);  
   



[5] Void Return Type

Ya, ini adalah salah satu fitur favorite berdasar review developer. Fitur ini menggenapkan fitur return type yang dikenalkan di PHP 7, di mana sebuah fungsi boleh jadi tidak memiliki return apapun dan akan dipaksa menjadi return null. Gimana contoh codenya? Ini dia:

 function dump($object): void  
 {  
   var_dump($object);  
 }  


Dengan fungsi void dapat me-return statement atau menambahkan return kosong.

[6] Class Constant Visibility

Sebetulnya hanya ada perubahan kecil di bagian ini, akan tetapi hal ini tetap menjadi bagian yang esensial dalam OOP yang berkaitan dengan encapsulation. Fitur ini menambahkan visibility modifiers untuk class constant.

 class Post  
 {  
   protected const PUBLISHED = 1;  
   protected const DRAFT = 2;  
   protected const TRASHED = 3;  
   
   // ...  
 }  
   


[7] Catching Multiple Exception Types

Bahasa pemrograman lain, java misalnya, menyediakan kemampuan untuk catch multiple exception type di dalam catch block yang sama. Hal ini tentu sangat bermanfaat, karena menghapus duplicate code.

Misal kita memiliki baris code seperti code di bawah:

 // ...  
   
 try {  
   $user->payMonth($month);  
 } catch (UserSuspendedException $ex) {  
   DB::rollBack();  
   
   return redirect()  
       ->back()  
       ->withInput()  
       ->withErrors([$ex->getMessage()]);  
 } catch (PaidMonthException $e) {  
   DB::rollBack();  
   
   return redirect()  
       ->back()  
       ->withInput()  
       ->withErrors([$ex->getMessage()]);  
 }  
   
 // ...  
   


Bisa kita lihat di atas terdapat duplicate code. Nah, sekarang kita bisa hapus duplicate code dengan menggunakan sintaks catch block yang baru. Ini dia contoh penggunaannya:

 // ...  
   
 try {  
   $user->payMonth($month);  
 } catch (PaidMonthException | UserSuspendedException $ex) {  
   DB::rollBack();  
   
   return redirect()  
       ->back()  
       ->withInput()  
       ->withErrors([$ex->getMessage()]);  
 }  
   
 // ...  


[8] ArgumentCountError Exception

Di versi PHP terdahulu mengijinkan untuk pemanggilan fungsi dengan argument yang sedikit dari yang seharusnya, misalnya perlu dua argumen dan kita malah isi satu, hal ini biasanya menyebabkan munculnya sebuah warning ketika ada missing argument.

 // PHP 5.6  
   
 function sum($a, $b)  
 {  
   return $a + $b;  
 }  
   
 sum();   
 // Warning: Missing argument 1 for sum()  
 // Warning: Missing argument 2 for sum()  
   
 sum(3);  
 // Warning: Missing argument 2 for sum()  
   
 sum(3, 4);  


Warning tidak terlalu bermanfaat pada kasus ini dan developer harus mengecek apakah semua argument sudah diisi dengan benar. Di PHP 7.1, warning tersebut diubah menjadi sebuah ArgumentCountError exception. Contohnya adalah sebagai berikut:

 // PHP 7.1  
   
 function sum($a, $b)  
 {  
   return $a + $b;  
 }  
   
 sum();   
 // Fatal error: Uncaught ArgumentCountError: Too few arguments to function sum(), 0 passed in /vagrant/index.php on line 18 and exactly 2 expected in /vagrant/index.php:13  
   
 sum(3); // skipped  
   
 sum(3, 4); // skipped   


[9] Invalid String Arithmetics

Sewaktu kita mulai belajar PHP, pernah dong ya kita coding soal matematika untuk latihan algoritma. Nah biasanya materi yang sering digunakan itu tentang operasi aritmatika. Dan kalau kita perhatikan, operasi aritmatika memakai string itu bisa jalan. Ini disebabkan karena PHP biasanya berurusan dengan web dan nilainya itu selalu berupa string.

Lalu apa maksudnya dengan Invalid String Arithmetics? Coba perhatikan code di bawah ini:

 // PHP 5.6  
   
 var_dump("1" + "2");  
 var_dump("1" + "a string");  
 var_dump("1" + "2 with a string");  
 int(3)  
 int(1)  
 int(3)  
   
 // PHP 7.1  
   
 var_dump("1" + "2");  
 var_dump("1" + "a string");  
 var_dump("1" + "2 with a string");  
 int(3)  
   
 Warning: A non-numeric value encountered in /vagrant/index.php on line 17  
 int(1)  
   
 Notice: A non well formed numeric value encountered in /vagrant/index.php on line 18  
 int(3)  


Ya, sekarang kita bakalan dapat warning jika ada nilai bukan angka. Selain itu, muncul juga notice tentang nilainya itu not well formatted (2 a string = 2).

***

Ya, itulah sebagian fitur baru yang terdapat pada PHP 7.1.0. Kamu bisa mengunjungi web RFC untuk melihat daftar fitur PHP 7.1.0 secara lengkap.

Semoga bermanfaat.
Semoga belajarnya menyenangkan.. 😄

***

Referensi:

RFC PHP 7.1.0 @ https://wiki.php.net/rfc#php_71

Komentar

Postingan populer dari blog ini

KONFIGURASI SUBDOMAIN DI VIRTUAL HOST WINDOWS

Fungsi Enkripsi dan Dekripsi Menggunakan PHP

Membuat Virtual Host di XAMPP Windows

Membuat Segitiga Siku Siku Dengan PHP

Code-writerTalk #2: Jadi, Harus mulai dari mana?