Breaking News

static analysis tools

3 Jenis Static Analysis Tools Untuk PHP

PHP merupakan bahasa pemrograman yang dijalankan dengan menggunakan PHP interpreter. Dengan kata lain, programmer tidak perlu menyusun source code PHP terlebih dulu saat akan menjalankannya. Hal ini merupakan keuntungan besar bagi seorang programmer karena proses pengembangan jadi semakin cepat.

Akan tetapi dibalik itu ada kerugian yang tidak bisa dihindari, yaitu jika terjadi error saat runtime maka programmer tidak akan bisa melihatnya. Dalam artikel kali ini kita akan membahas tentang 3 static analysis tools yang digunakan untuk PHP: Phan, PHPStan, dan Psalm. 

Mengapa menggunakan static analysis tools?

Setiap bahasa pemrograman yang bertipe static typing, variabel atau suatu fungsi harus dideklarasikan tipenya. Karena itu, source code dari suatu program pun harus diubah ke dalam bahasa mesin (managed code) sebelum bisa dijalankan. Nah, proses ini biasanya dijalankan oleh tools bernama compiler. 

Mekanismenya, sebelum suatu program dijalankan compiler akan mengecek tipe data dari variabel serta fungsi apa yang sesuai dengan yang dideklarasikan. Dengan begitu, error atau kesalahan bisa dideteksi bahkan sebelum program berjalan. 

Sementara bahasa pemrograman yang sifatnya dynamic typing seperti PHP, Javascript, atau Ruby, variabel atau fungsi yang ada tidak perlu didefinisikan dulu tipenya. Selain itu, source code juga tidak harus disusun dulu dan akan langsung dijalankan oleh interpreter. 

Sayangnya, tidak adanya proses pengecekan tipe data berarti kemungkinan terjadinya runtime error lebih besar dibanding static typing. 

Nah terlepas dari kelebihan dan kekurangan dua jenis bahasa pemrograman tersebut, runtime error pada ketika menyelesaikan sebuah produk merupakan hal yang buruk dan harus dihindari semaksimal mungkin. 

Di sinilah static analysis tools mengambil pada PH P mengambil bagian. Dengan menggunakan tools ini, maka kelebihan untuk mendeteksi runtime error sebelum program dijalankan bisa digunakan di PHP. 

Jadi jika Anda memiliki anggota tim yang banyak dan sebuah program yang berskala besar, statistic tools ini akan sangat membantu. Berikut ini beberapa error yang sering dihadapi oleh programmer PHP:

$login = false;

if ($login) {

    $msg = “Hello World”;

}

echo $msg;

Kode tersebut, secara syntax, seharusnya tidak akan mengalami error. Tapi pada saat dijalankan, kode di atas akan mengakibatkan runtime error sebab “$msg” merupakan variabel yang tidak dikenali. 

/**

 * @param $args array

 * @return int

 */

function testArray($args) {

    return $args[0];

}

$numbers = [1, “two”, 3];

echo testArray($numbers);

Kode ini akan mengalami error bahkan sebelum dijalankan sebab static analyzer sudah bisa mendeteksi bahwa parameter dari fungsi testArray merupakan array of mixed dan bukan yang diinginkan oleh array of finger. Kedua hal ini bisa ditangkap dengan mudah menggunakan static analyzer tools.

Static analytic tools untuk PHP

Phan

Phan merupakan static analyzer tools yang ditulis menggunakan PHP dan membutuhkan C extension php-ast untuk bisa dijalankan. Dengan adanya C extension ini, maka diperlukan adanya proses penyusunan melalui PECL maupun metode lain sebelum PHan digunakan. 

Untungnya, hal yang terbilang “ribet” ini bisa Anda hindari dengan menggunakan Docker Image. Dan tentu saja, Phan dapat membantu programmer dalam menemukan berbagai error bahkan sebelum program dijalankan. 

Adapun untuk cara menginstal Phan melalui composer adalah sebagai berikut: 

$ composer require –dev phan/phan

Setelah di-instal, Phan membutuhkan konfigurasi file untuk menentukan detail dari tingkat pengecekan yang akan dijalankan. Artinya seberapa jauh pengecekan yang Anda lakukan tergantung dari konfigurasi file ini. 

Biasanya file ini disimpan di .phan/config.php atau Anda juga bisa membuatnya sendiri melalui perintah phan –init –init-level=X. Dan berikut ini adalah hasil analisa dari Phan terhadap dua file, yaitu example1.php dan example2.php

$ ./vendor/bin/phan

Parsing files…

░░                                                     2 / 2 (100%) 9MB

Analyzing classes…

░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 12MB

Analyzing functions…

░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 12MB

Analyzing files…

░░                                                     2 / 2 (100%) 30MB

src/example1.php:5 PhanImpossibleConditionInGlobalScope Impossible attempt to cast $login of type false to truthy in the global scope (may be a false positive)

src/example1.php:9 PhanPossiblyUndeclaredGlobalVariable Global variable $msg is possibly undeclared

src/example2.php:12 PhanTypeMismatchArgument Argument 1 ($args) is $numbers of type array{0:1,1:’two’,2:3} but \testArray() takes int[] defined at src/example2.php:7

Berdasarkan hasil di atas, bisa dilihat bahwa Phan berhasil menangkap adanya 3 kesalahan pada file example1 di baris 5 dan 9. Sementara pada file example2, kesalahan terletak pada baris 12. 

PHPStan

PHP Stan merupakan static analyzer tools yang ditulis menggunakan PHP dan tidak memanfaatkan C extension untuk parser-nya. Sebaliknya, PHPStan memanfaatkan parser PHP murni atau nikic atau PHP-Parser. 

Di samping itu, PHPStan juga bisa mengetahui berbagai macam error yang ditemukan seperti bahasa pemrograman static typing. Nah, untuk meng-install PHPStan menggunakan Composer, Anda bisa memasukkan perintah ini:

$ composer require –dev phpstan/phpstan

Berbeda dengan Phan, PHPStan tidak membutuhkan konfigurasi file untuk menjalankannya. Singkatnya, tool ini bisa langsung menganalisa source code setelah diinstal dengan Composer.

Berikut ini contoh hasil analisa dari file example1.php dan example2.php menggunakan PHPStan:

$ ./vendor/bin/phpstan analyse –level 8 src/

2/2 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

 —— ————————————-

  Line   example1.php

 —— ————————————-

  5      If condition is always false.

  9      Variable $msg might not be defined.

 —— ————————————-

 —— ——————————————————————————————–

  Line   example2.php

 —— ——————————————————————————————–

  12     Parameter #1 $args of function testArray expects array, array given.

 —— ——————————————————————————————–

 [ERROR] Found 3 errors

Jadi sama seperti Phan, PHPStan juga berhasil mendapatkan 3 kesalahan di dalam file example1 pada baris 5 dan 9. Sedangkan pada file example2, kesalahan ditemukan di barsi 12.

Psalm

Psalm merupakan static analysis tools yang juga ditulis dengan PHP, sama seprti PHPStan. Sekadar informasi, Psalm ini dibentuk oleh Vimeo, salah satu perusahaan layanan video terbesar di dunia. 

Karena memiliki kesamaan dengan PHPStan, Psalm ini memanfaatkan PHP parser murni dari nikic/PHp-Parser untuk melakukan berbagai macam pengecekan logic error maupun static error.

Anda dapat melakukan instalasi Psalm ini dengan menggunakan Composer melalui perintah ini: 

$ composer require –dev vimeo/psalm

Berbeda dengan dua tools yang lain, Psalm ini membutuhkan file konfigurasi berbentuk XML yang bisa Anda buat secara otomatis menggunakan perintah psalm –init. 

Berikut ini contoh hasil analisa dari Psalm pada file example1.php dan example2.php

Scanning files…

Analyzing files…

EE

ERROR: TypeDoesNotContainType – src/example1.php:5:5 – if (false) is impossible (see https://psalm.dev/056)

if ($login) {

ERROR: PossiblyUndefinedGlobalVariable – src/example1.php:9:6 – Possibly undefined global variable $msg, first seen on line 6 (see https://psalm.dev/126)

echo $msg;

ERROR: MixedArgument – src/example1.php:9:6 – Argument 1 of echo cannot be mixed, expecting string (see https://psalm.dev/030)

echo $msg;

ERROR: InvalidScalarArgument – src/example2.php:12:16 – Argument 1 of testArray expects array, array{int(1), string(two), int(3)} provided (see https://psalm.dev/012)

echo testArray($numbers);

——————————

4 errors found

——————————

Checks took 0.34 seconds and used 38.360MB of memory

Psalm was able to infer types for 87.5000% of the codebase

Berdasarkan hasil tersebut, bisa dilihat Psalm berhasil menemukan 4 error dan yang menjadi tambahannya adalah error mengenai perintah echo $msg. Mengapa demikian? Sebab Psalm menilai $msg bukan merupakan sebuah string, jadi harus diubah dulu untuk menjalankan programnya.

Baca Juga: Rekomendasi Library Javascript untuk Augmented Reality

Leave a Reply

Your email address will not be published. Required fields are marked *