PHP #09 - Konstanta

18 Aug 2020 • ⏳ ~ 6 menit

 

Konstanta dan Sifat Konstanta

Konstanta merupakan suatu tempat penyimpanan sebuah nilai layaknya sebuah variabel. Hanya saja, nilai yang telah dimuat ke dalam sebuah konstanta tidak dapat diubah lagi selama script dijalankan. Hal ini sesuai dengan namanya, “konstan” yang berarti tetap.

Kapan kita menggunakan konstanta?

Konstanta biasanya digunakan untuk menyimpan sebuah nilai yang dalam pemanfaatannya tidak perlu mengubah nilainya. Misalnya nilai dari PHI (3.14159), nilai dari sebuah API key, hingga nilai tertentu dari program kita yang tidak perlu diubah lagi. Oleh karena itu, kita memerlukan konstanta untuk mengunci sebuah nilai agar tidak dapat diubah.

Aturan Penulisan Konstanta

Layaknya sebuah variabel, konstanta juga memiliki beberapa ketentuan penulisan, antara lain:

1. Pendefinisian Konstanta dalam PHP

Tidak seperti variabel yang menggunakan tanda $ sebagai penanda, konstanta dalam PHP dapat didefinisikan menggunakan 2 cara, yaitu keyword const dan fungsi define().

Jika kita mendefinisikan sebuah konstanta dengan keyword const, caranya mirip seperti menginisialisasi sebuah variabel. Hanya saja kita perlu mengganti tanda $ dengan keyword const sebelum nama variabel. Contoh penulisannya:

<?php
    const PHI = 3.14159;
    echo PHI;
?>

Jika kita mendefinisikan sebuah konstanta dengan fungsi define(), kita perlu menyediakan dua nilai sebagai parameter wajib, yaitu nama konstanta dan nilainya.

Sintaks fungsi define()

<?php
  define($name, $value, $case_insensitive = false);
?>
  • $name merupakan parameter yang memuat nama sebuah konstanta. Parameter ini memuat nilai dengan tipe data string.
  • $value merupakan parameter yang memuat nilai sebuah konstanta. Parameter ini memuat nilai dengan beragam jenis tipe data scalar, seperti integer, float, boolean, string, dan NULL. Sejak PHP 7, $value juga dapat memuat nilai bertipe data array.
  • $case_insensitive merupakan parameter opsional, yang memuat nilai bertipe data boolean untuk menentukan apakah konstanta yang didefinisikan bersifat case insensitive atau tidak. Secara default, nilai parameter ini adalah false. Pemanfaatan parameter ini sudah deprecated sejak PHP 7.3.0 dan akan dihapus pada PHP 8.0.0. Untuk itu, penggunaan parameter ini tidak disarankan.

Mari kita perhatikan contoh penerapan fungsi define().

<?php
    define('PHI', 3.14159);
    echo PHI;
?>

Kedua contoh di atas akan menghasilkan output berupa:

3.14159

2. Bersifat Case Sensitive

Konstanta dalam PHP bersifat case sensitive. Hal ini berarti definisi konstanta PHI berbeda dengan konstanta Phi. Namun, penulisan nama konstanta seharusnya menggunakan UPPERCASE sebagai pembeda konstanta dengan variabel lain. Hal ini merupakan kesepakatan lazim pemrogram PHP secara umum. Berikut contoh penulisan yang baik dan benar untuk konstanta.

<?php
    // Penulisan nama konstanta yang tidak disarankan
    const Phi = 3.14;

    // Penulisan nama konstanta yang disarankan
    const PHI = 3.14159;
    define('API_KEY', '23oQ94nasY129');
?>

3. Nilai Konstan Tidak Dapat Diubah

Sesuai pernyataan sebelumnya, nilai suatu konstanta tidak dapat diubah lagi setelah diinisialisasi pertama kali selama script dijalankan. Jika kita mencoba mengubah nilai konstanta, kita akan mendapatkan pesan peringatan. Perhatikan contoh berikut.

<?php
    const PHI = 3.14159;

    // Pengubahan nilai PHI dari 3.14159 menjadi 3.14
    define('PHI', 3.14);

    echo PHI;
?>
Notice: Constant PHI already defined
3.14159

Perlu kita perhatikan bahwa kita tidak seharusnya mendefinisikan konstanta dengan nama yang sama dalam satu script, baik dengan keyword const maupun dengan fungsi define().

Perbedaan const dan define

Keyword const dan fungsi define() sama-sama berfungsi untuk membentuk sebuah konstanta. Namun dalam pemanfaatannya, kedua cara tersebut memiliki beberapa perbedaan. Mari kita perhatikan perbedaannya pada tabel berikut.

constdefine()
Membentuk konstanta saat compile time (ketika program dibentuk untuk siap dijalankan)Membentuk konstanta saat run time (ketika program dijalankan)
Selalu bersifat case sensitiveDapat bersifat case sensitive, dapat juga bersifat case insensitive (tidak disarankan)
Dapat diterapkan dalam class dan interfaceTidak dapat diterapkan dalam class atau interface
Tidak dapat digunakan untuk mendefinisikan konstanta dalam blok kondisionalDapat digunakan untuk mendefinisikan konstanta dalam blok kondisional
Dapat bernilai ekspresi sejak PHP 5.6, sebelumnya hanya dapat memuat nilai static scalar seperti integer, float, string, boolean, NULL.Dapat bernilai ekspresi (seperti operasi matematika)

Jika kita lihat pada perbedaan-perbedaan pada tabel, terdapat cakupan mengenai blok kondisional, class, hingga interface. Mari kita lakukan percobaan untuk lebih paham perbedaannya.

Mendefinisikan Konstanta dalam Blok Kondisional

Pertama-tama, kita akan melakukan percobaan mengenai penerapan dalam blok kondisional. Mari kita perhatikan kode berikut.

<?php
  if (3 < 5) {
    const PHI = 3.14159;
  }
  echo "PHI = " . PHI;
?>

Jika kita mencoba untuk menerapkan keyword const dalam blok kondisional, kita akan mendapatkan error seperti ini.

Parse error: syntax error, unexpected 'const' (T_CONST)

Sebaliknya, jika kita mencoba mendefinisikan konstanta dalam blok kondisional dengan fungsi define(), kita tidak akan mendapatkan error. Perhatikan contoh berikut.

<?php
  if (3 < 5) {
    define('PHI', 3.14159);
  }
  echo "PHI = " . PHI;
?>
PHI = 3.14159

Mendefinisikan Konstanta Dalam Class atau Interface

Selanjutnya, kita akan melakukan percobaan mengenai penerapan dalam class atau interface. Mari kita perhatikan kode berikut.

<?php
 class Science {
   const PHI = 3.14159;
   define('C', 3E8);
 }
?>

Jika kita mencoba untuk menerapkan fungsi define() dalam class, kita akan mendapatkan error seperti ini.

Parse error: syntax error, unexpected 'define' (T_STRING), expecting function (T_FUNCTION) or const (T_CONST)

Namun, kita tidak akan mendapatkan error mengenai penggunaan const dalam class.

Mendefinisikan Konstanta Dengan Nilai Berupa Ekspresi

Selanjutnya, kita akan melakukan percobaan mendefinisikan konstanta dengan nilai dalam bentuk ekspresi. Mari kita perhatikan kode berikut.

<?php
  define('FIRST_AREA', 10 * 10);
  const SECOND_AREA = 12 + 12;
  echo FIRST_AREA . " & " . SECOND_AREA;

  define('TIME', time());
  const THIRD_AREA = 2 * 8 > 6 ? FIRST_AREA / 5 : 0;
  echo TIME . " --- " . THIRD_AREA;
?>
100 & 24
1597209479 --- 20

Kita tidak lagi mendapatkan error saat memuat nilai berupa ekspresi ke dalam konstanta. Hal ini dikarenakan sejak versi 5.6, definisi konstanta dengan keyword const sudah dapat memuat nilai berupa ekspresi.

Fungsi time() merupakan fungsi bawaan PHP (built-in function PHP) yang mengembalikan nilai berupa waktu dalam satuan detik sejak Unix Epoch (1 January 1970 00:00:00 GMT).

Pengecekan Nilai Konstanta

Pengecekan nilai konstanta dapat dilakukan dengan menggunakan fungsi bawaan PHP, yaitu defined(). Fungsi defined() mengambil nama konstanta sebagai parameter untuk diperiksa dan mengembalikan nilai boolean berupa true atau false. Nilai boolean menunjukkan apakah konstanta itu telah terdefinisi atau tidak. Nama konstanta yang diterima sebagai parameter dituliskan dalam bentuk string. Contoh penerapannya adalah sebagai berikut.

<?php
  const PHI = 3.14159;
  define('API_KEY', '23oQ94nasY129');

  if (defined('PHI')) {
    echo "PHI terdefinisi dengan nilai " . PHI;
  } else {
    echo "Tidak ada definisi terhadap konstanta PHI.";
  }

  echo defined('API_KEY') ? ("API_KEY -> " . API_KEY) : ("Tidak ada definisi terhadap konstanta API_KEY.");
?>
PHI terdefinisi dengan nilai 3.14159
API_KEY -> 23oQ94nasY129

Sebagai tambahan, kita juga dapat menerapkan operator && dan operator || untuk menggantikan percabangan/conditional yang sederhana. Agar lebih mengerti, mari kita perhatikan contoh berikut.

<?php
  if (!defined('PHI')) {
    define('PHI', 3.14159);
  }
  echo PHI;
?>

Pada contoh di atas, kita masih menerapkan percabangan/conditional. Apabila konstanta PHI belum terdefinisi, kita akan mendefinisikan konstanta PHI dengan nilai 3.14159.

Selanjutnya, untuk menyingkat penulisan kode di atas, kita dapat memanfaatkan operator && sebagai pengganti conditional. Perhatikan contoh berikut.

<?php
  !defined('PHI') && define('PHI', 3.14159);
  echo PHI;
?>

Arti dari kode di atas adalah jika !defined('PHI') bernilai true (dengan kata lain konstanta PHI belum terdefinisi), akan dijalankan statement setelah operator &&, yaitu define('PHI', 3.14159). Sebaliknya, ketika !defined('PHI') bernilai false, statement setelah operator && tidak akan dijalankan.

Selain itu, kita akan membahas pemanfaatan operator ||. Perhatikan contoh berikut.

<?php
  defined('PHI') || define('PHI', 3.14159);
  echo PHI;
?>

Arti dari kode di atas adalah jika defined('PHI') bernilai true (konstanta PHI telah terdefinisi), tidak akan dijalankan statement setelah operator ||, yaitu define('PHI', 3.14159). Sebaliknya, ketika defined('PHI') bernilai false, statement setelah operator || akan dijalankan.

Cara kerja operator || berkebalikan dengan operator &&.

Sebenarnya, ketiga kode di atas menjalankan hal yang sama, yaitu mendefinisikan konstanta PHI jika belum terdefinisi. Hasil keluaran ketiga kode di atas adalah sebagai berikut.

3.14159
PHP

PHP #10 - Operator (Bag. I)

PHP #08 - Variabel Global dan Superglobal

comments powered by Disqus