PHP Menengah

Site: Elearning Muhidin Saimin
Course: Web Development
Book: PHP Menengah
Printed by: Guest user
Date: Tuesday, 17 September 2024, 3:40 AM

Description

Tutorial Belajar PHP Tingkat Menengah


1. Tanggal dan Waktu (Prosedural)

PHP: Bekerja Dengan Tanggal Dan Waktu (Prosedural)

Selamat datang di pertemuan pertama dari seri tutorial PHP kelas menengah.

Pada pertemuan kali ini, kita akan mempelajari hal-hal yang berkaitan dengan tanggal dan waktu di PHP. Mulai dari cara membuat date time, mengekstrak string menjadi date time, menampilkan tanggal dan waktu dalam format tertentu, hingga memanipulasi tanggal dan waktu.

Pembahasan tentang tanggal dan waktu pada PHP ini kita bagi dalam 2 pertemuan, satu pertemuan untuk pembahasan dengan pendekatan prosedural, dan pertemuan yang lain akan kita bahas dengan pendekatan OOP atau pendekatan objek.

Tanggal dan Waktu Pada PHP

Terdapat banyak cara dan pendekatan untuk memanipulasi tanggal dan waktu pada PHP. Yang paling inti adalah pendekatan prosedural dan pendekatan OOP.

Pendekatan prosedural umumnya menggunakan fungsi bawaan php yaitu fungsi date(), sedangkan pendekatan objek biasanya menggunakan kelas bawaan PHP bernama keals DateTime.

Pada tutorial ini kita akan membahas penggunakan pendekatan prosedural untuk memanipulasi tanggal dan waktu pada PHP, dan pada pertemuan selanjutnya insyaallah kita akan membahasnya dengan pendekatan pemrograman berbasis objek.

Pendekatan OOP vs Prosedural

Jika anda bingung apa itu Object Oriented Programming (OOP) dan apa bedanya dengan pendekatan prosedural, jangan khawatir. Insyaallah kita akan mempelajarinya dalam seri tutorial php berikut-berikutnya.

Intinya, pendekatan prosedural adalah penggunaan fungsi tanpa ada pembuatan suatu instan dari kelas tertentu.

Sedangkan penggunakan pendekatan objek atau OOP, anda perlu membuat instan dari suatu kelas tertentu dengan perintah new.

Contoh prosedural:

<?php

echo date('d-m-Y'); // 17-02-2020

Contoh pendekatan objek:

<?php

$tanggalHariIni = new DateTime();

echo $tanggalHariIni->format('d-m-Y'); // 17-02-2020

Untuk lebih detilnya, anda anda bisa melihat pembahasan tentang memanipulasi tanggal dan waktu pada PHP dengan pendekatan objek.

Penggunaan fungsi date()

Secara sintaks, fungsi date() menerima 2 paremeter. Satu parameter bersifat wajib, dan yang satu lagi bersifat opsional.

<?php

$hariIni = date(format[, timestamp]);

Penjelasan parameter:

  • format: adalah format tanggal dan waktu yang akan kita tampilkan. Parameter ini bertipe data string.
  • timestamp: timestamp bersifat opsional, jika tidak didefinisikan, PHP akan menggunakan waktu sekarang ketika fungsi date dipanggil.

Contoh menampilkan tahun sekarang:

<?php

echo date('Y') . '<br>';
echo date('y') . '<br>'; # 2 digit terakhir dari tahun sekarang

Output:

2020
20

Contoh menampilkan hari dan bulan:

<?php

echo date('d/m/Y') . '<br>';
echo date('d-m-Y') . '<br>';
echo date('d, m Y') . '<br>';

# anda juga bisa menggunakan escape string
echo date('d \wk\wk m \wk\wk Y') . '<br>';

Output:

17/02/2020
17-02-2020
17, 02 2020
17 wkwk 02 wkwk 2020

Fungsi date() dengan timestamp

Seperti yang sudah disebutkan di atas, fungsi date() menerima 2 parameter dan parameter yang kedua adalah timestamp.

Apa itu timestamp?

Timestamp adalah jarak waktu dari tanggal 1 Januari 1970 pukul 00:00 ke tanggal sekarang dan waktu sekarang. Jarak tersebut didefinisikan dalam satuan detik.

Untuk mengetahui timestamp dari waktu sekarang, anda bisa menggunakan fungsi time().

<?php

echo time();

Output:

1581946962

Karena timestamp adalah jarak waktu dengan satuan detik, maka angka di atas akan terus berubah seiring dengan waktu ketika anda memanggil fungsi time().

Menampilkan timestamp dengan fungsi date()

Kita bisa menampilkan timestamp ke dalam bentuk string tanggal dan waktu dengan menjadikannya parameter ke-2 pada fungsi date().

Contoh, misalkan kita punya timestamp 1234567890. Lalu kita ingin menampilkannya dalam format d-m-Y, kita bisa melakukannya dengan kode program berikut:

<?php
$timestamp = 1234567890;
$stringDate = date('d-m-Y H:i', $timestamp);

echo "Timestamp: {$timestamp} <br>";
echo "String date: {$stringDate} <br>";

Output:

Timestamp: 1234567890
String date: 14-02-2009 06:31

Konversi String date() ke Dalam Bentuk Timestamp

Kita telah mengetahui cara menampilkan timestamp ke dalam string tanggal dan waktu.

Sekarang pertanyaannya, kita memiliki string tanggal atau waktu, lalu kita ingin mendapatkan nilai timestamp-nya, bagaimana caranya?

Kita bisa menggunakan fungsi bawaan php yang bernama strtotime().

Fungsi ini menerima parameter string dalam berbagai bentuk. Perhatikan contoh berikut:

<?php

echo strtotime("now") . '<br>'; # timestime untuk waktu sekarang
echo strtotime("2020-12-31") . '<br>'; # timestamp untuk tanggal 31 Desember 2020
echo strtotime("2020-12-31 12:00") . '<br>'; # timestamp untuk tanggal 31 Desember 2020 pukul 12:00

Output:

1581948269
1609347600
1609390800

Ia juga bisa menerima deskripsi tanggal dan waktu dalam bahasa inggris, bahkan ia juga bisa menerima parameter dinamis terhadap waktu sekarang. Perhatikan contoh berikut:

<?php

echo strtotime("05th maret 2004") . '<br>'; # untuk tanggal 5 Maret 2004
echo strtotime("next sunday") . '<br>'; # hari minggu yang akan datang
echo strtotime("previous friday") . '<br>'; # hari jumat yang lalu
echo strtotime("+2 days") . '<br>'; # 2 hari lagi

Output:

1582390800
1581613200
1582121258

Format Tanggal dan Waktu

Kita telah mencoba beberapa kode format tanggal, kode format tanggal didefinisikan dengan satu karakter string. Berikut ini adalah kode format tanggal dan waktu yang sering digunakan pada PHP.

Kode format hari

Beberapa kode format hari yang sering digunakan di dalam bahasa pemrograman PHP.

KodeKeteranganNilai Kembalian
dUrutan hari dalam bulan, diikuti angka 0 untuk hari < 1001-31
jUrutan hari dalam bulan, tidak diikuti angka 01-31
DNama hari, hanya 3 karakter. Nama hari sesuai dengan pilihan lokalisasiMon - Sun
lNama hari secara penuh. Nama disesuaikan dengan pilihan lokalisasiSunday - Saturday

Kode format bulan

Beberapa kode format bulan yang sering digunakan di dalam bahasa pemrograman PHP.

KodeKeteranganNilai Kembalian
mUrutan bulan dalam tahun, diikuti angka 0 untuk hari < 1001-12
nUrutan bulan dalam tahun, tidak diikuti angka 01-12
MNama pendek dari suatu bulan, hanya 3 karakter. Nama disesuaikan dengan pilihan lokalisasiJan-Dec
FNama lengkap dari suatu bulan. Nama disesuaikan dengan pilihan lokalisasiJanuary - December

Kode format tahun

Beberapa kode format tahun yang sering digunakan di dalam bahasa pemrograman PHP.

KodeKeteranganNilai Kembalian
YMenampilkan 4 digit tahunContoh: 1990 - 2030
yMenampilkan hanya 2 digit terakhir dari tahunContoh: 90 - 30

Kode format waktu

Beberapa kode format waktu yang sering digunakan di dalam bahasa pemrograman PHP.

KodeKeteranganNilai Kembalian
hJam dalam format 12-hour01-12
HJam dalam format 24-hour01-24
aLowercase Ante meridiem and Post meridiemam-pm
AUppercase Ante meridiem and Post meridiemAM-PM
iMenit dengan diikuti angka 001-59
sDetik dengan diikuti angka 001-59

Untuk daftar format tanggal dan waktu yang lebih lengkap, anda bisa merujuk secara langsung ke dokumentasi resmi php.

Pengaturan Zona Waktu atau Time Zone

Zona waktu PHP bisa berbeda dengan zona waktu pengaturan server kita. Misalkan server kita menggunakan zona waktu "America/Regina", PHP bisa berjalan dengan zona waktu yang lain semisal "Asia/Jakarta".

Dan zona waktu ini adalah zona waktu yang digunakan disemua fungsi yang berkaitan dengan tanggal dan waktu pada PHP pada kode program anda.

Untuk mengganti pengaturan zona waktu, anda bisa mengubahnya pada file php.ini.

Atau anda juga bisa menggunakan fungsi date_default_timezone_set().

Fungsi tersebut menerima satu parameter yaitu nama zona waktu yang kita pilih. Perhatikan contoh berikut:

<?php
date_default_timezone_set("America/Regina") . '<br>';

echo date("d-m-Y H:i") . '<br>';

// ganti ke indonesia
date_default_timezone_set("Asia/Jakarta") . '<br>';

echo date("d-m-Y H:i");

Dalam kode program di atas, kita memanggil fungsi date() dua kali untuk menampilkan tanggal dan waktu sekarang. Akan tetapi, kedua fungsi date() di atas berjalan dengan zona waktu yang berbeda karena kita telah menggantinya dengan fungsi date_default_timezone_set().

Output dari kode program di atas adalah:

18-02-2020 03:50
18-02-2020 16:50

Daftar zona waktu yang didukung di PHP

Untuk melihat daftar zona waktu yang didukung pada PHP, anda bisa pergi ke dokumen resmi php.net pada halaman Zona Waktu.

Atau anda bisa mendapatkan list array dari zona waktu tersebut dari fungsi static DateTimeZone::listIdentifiers() seperti contoh berikut:

<?php

$daftarTimezone = DateTimeZone::listIdentifiers();

foreach ($daftarTimezone as $timezone) {
  echo "{$timezone} <br>";
}

Output:

Memanipulasi Tanggal dan Waktu

Memanipulasi tanggal dan waktu adalah pekerjaan yang sangat penting dalam proses pembuatan aplikasi atau web. Misal kita punya toko online, lalu kita ingin mengirim peringatan tagihan yang harus dibayar setelah 3 hari dari proses pembelian, maka di sini kita butuh untuk memanipulasi tanggal dan waktu sehingga kita bisa tahu 3 hari setelah tanggal pembelian itu tanggal berapa dan jam berapa?

Untuk melakukan pekerjaan ini, cara yang paling pas adalah menggunakan pendekatan objek dengan kelas bawaan PHP bernama DateTime, atau mungkin bisa dengan menggunakan pustaka pihak ketiga seperti Carbon.

Untuk lebih detilnya, insyaallah tentang manipulasi tanggal dan waktu ini akan kita bahas pada pertemuan selanjutnya.

Membandingkan Tanggal dan Waktu

Kita bisa membandingkan tanggal dan waktu dengan pendekatan prosedural menggunakan 2 cara:

  • membandingkan string hasil kembalian dari fungsi date(). Cara ini tidak terlalu direkomendasikan.
  • mengubah tanggal menjadi timestamp lalu mulai membandingkan keduanya. Cara ini adalah cara yang direkomendasikan.

Perhatikan contoh berikut:

<?php

$tanggal1 = "2020-01-01";
$tanggal2 = "2020-01-31";

if ($tanggal1 < $tanggal2) {
    echo "{$tanggal1} < {$tanggal2}";
} elseif ($tanggal1 === $tanggal2) {
    echo "{$tanggal1} = {$tanggal2}";
} else {
    echo "{$tanggal1} > {$tanggal2}";
}

Output:

2020-01-01 < 2020-01-31

Contoh perbandingan tanggal dengan menggunakan timestamp:

<?php

$tanggal1 = "2020-02-01";
$tanggal2 = "2020-01-31";

if (strtotime($tanggal1) < strtotime($tanggal2)) {
    echo "{$tanggal1} < {$tanggal2}";
} elseif ($tanggal1 === $tanggal2) {
    echo "{$tanggal1} = {$tanggal2}";
} else {
    echo "{$tanggal1} > {$tanggal2}";
}

Output:

2020-02-01 > 2020-01-31

Pembahasan Selanjutnya

Pada tutorial ini kita telah mempelajari bagaimana cara kita bekerja dengan tanggal dan waktu pada PHP dengan pendekatan prosedural. Kita telah mencoba beberapa fungsi seperti fungsi date()time()strtotime() dan juga fungsi date_default_timezone_set() untuk mengatur zona waktu default.

Pada pertemuan selanjutnya, insyaallah kita akan melanjutkan pembahasan yang sama, hanya saja menggunakan pendekatan yang berbeda! Yaitu pendekatan objek.


2. Tanggal dan Waktu (Objek)

PHP: Bekerja Dengan Tanggal Dan Waktu (Pendekatan Objek)

Pertemuan sebelumnya kita telah membahas cara bekerja dengan tanggal dan waktu pada PHP dengan pendekatan prosedural. Pada pertemuan kali ini, kita masih akan berkutat dengan pembahasan tersebut, akan tetapi kita akan melakukannya dengan pendekatan objek. Yaitu dengan menggunakan fungsi-fungsi yang ada pada kelas bawaan PHP bernama DateTime.

Inisialisasi Tanggal dan Waktu

<?php

$hariIni = new DateTime();

echo $hariIni->format('d-m-Y H:i') . '<br>';

Output:

10-02-2020 14:50
<?php

$hariIni = new DateTime("2020-02-10 14:53"); 
$awalFebruari = new DateTime("1st February 2020 01:00"); 

echo $hariIni->format('d-m-Y H:i') . '<br>';
echo $awalFebruari->format('d-m-Y H:i') . '<br>';

Output:

10-02-2020 14:53
01-02-2020 01:00

Format Tanggal dan Waktu

Sama seperti pendekatan prosedural dengan fungsi date(), kita juga bisa melakukan pemformatan tanggal dan waktu pada kelas DateTime dengan kode yang sama.

Perhatikan beberapa contoh berikut:

<?php

$hariIni = new DateTime();

echo $hariIni->format('l F Y, H:i') . '<br>';
echo $hariIni->format('D M y, H:i') . '<br>';
echo $hariIni->format('d-m-Y, h:iA') . '<br>';

Output:

Wednesday February 2020, 17:24
Wed Feb 20, 17:24
19-02-2020, 05:24PM

Timestamp

Timestamp adalah jarak waktu dari tanggal 1 Januari 1970 pukul 00:00 ke tanggal dan jam sekarang. Jarak tersebut didefinisikan dalam satuan detik.

Timestamp merupakan data dengan tipe integer dan ia adalah satuan data yang diakui di berbagai macam sistem dan bahasa pemrograman.

Pada tutorial sebelumnya kita telah belajar bagaimana cara mengetahui timestamp waktu sekarang dan bagaimana cara mengkonversinya ke bentuk tanggal dan waktu yang bisa dibaca manusia.

Dan sekarang, kita akan melakukan hal yang sama akan tetapi menggunakan kelas DateTime.

Konversi DateTime ke timestamp

Kita bisa mengkonversi instan dari kelas DateTime ke dalam timestamp dengan memanggil fungsi getTimestamp().

Perhatikan contoh berikut:

<?php

$hariIni = new DateTime("2020-12-31");

echo "Tanggal: " . $hariIni->format('d-m-Y') . '<br>';
echo "Timestamp: " . $hariIni->getTimestamp() . " <br>";

Output:

Tanggal: 31-12-2020
Timestamp: 1609347600

Konversi timestamp ke DateTime

Jika kita memiliki data berupa timestamp lalu ingin mengubahnya ke dalam instan DateTime, kita bisa melakukannya dengan membuat instan DateTime terlebih dahulu, lalu memanggil fungsi setTimestamp() untuk mengkonversinya.

Perhatikan contoh berikut:

<?php

$timestamp = 1234567890;

$hariIni = new DateTime();
$hariIni->setTimestamp($timestamp);

echo "Timestamp: {$timestamp} <br>";
echo "Tanggal: " . $hariIni->format('d-m-Y') . '<br>';

Output:

Timestamp: 1234567890
Tanggal: 14-02-2009

Mengganti Lokalisasi

Jika kita ingin agar nama hari dan nama bulan ditampilkan dengan Bahasa Indonesia, kita bisa melakukannya dengan mengubah lokalisasi PHP menjadi Bahasa Indonesia. Sehingga teks yang awalnya seperti ini:

Wednesday February 2020, 17:24
Wed Feb 20, 17:24

Berubah menjadi:

Rabu 19 Februari 2020, 20:11
Rab 19 Feb 2020, 20:11

Bagaimana caranya? Insyaallah akan kita bahas pada pertemuan selanjutnya.

Pengaturan Time Zone

Secara umum untuk pengaturan time zone atau zona waktu, kita bisa mengaturnya dengan dua cara:

  • lewat pengaturan file php.ini
  • atau dengan memanggil fungsi date_default_timezone_set().

Pada pembahasan tanggal dan waktu bagian 1 kita telah membahas tentang pengaturan zona waktu dengan fungsi date_default_timezone_set().

Fungsi tersebut juga bisa bekerja meskipun kita menggunakan DateTime.

Akan tetapi, untuk penggunaan DateTime, kita bisa menggunakan cara lain untuk mengatur zona waktu: yaitu dengan mendefinisikannya pada parameter ke-2 ketika instantiasi kelas DateTime.

Perhatikan contoh berikut:

<?php

$tanggal1 = new DateTime('now', new DateTimeZone('Asia/Jakarta'));
$tanggal2 = new DateTime('now', new DateTimeZone('America/Regina'));

echo "Tanggal 1: " . $tanggal1->format("d-m-Y H:i") . "<br>";
echo "Tanggal 2: " . $tanggal2->format("d-m-Y H:i") . "<br>";

Output:

Tanggal 1: 19-02-2020 20:19
Tanggal 2: 19-02-2020 07:19

Memanipulasi Tanggal dan Waktu

Memanipulasi tanggal dan waktu adalah pekerjaan yang sangat penting dalam proses pembuatan aplikasi atau web. Misal kita punya toko online, lalu kita ingin mengirim peringatan tagihan yang harus dibayar setelah 3 hari dari proses pembelian, maka di sini kita butuh untuk memanipulasi tanggal dan waktu sehingga kita bisa tahu 3 hari setelah tanggal pembelian itu tanggal berapa dan jam berapa?

Dengan menggunakan fungsi-fungsi yang dimiliki kelas DateTime, kita bisa melakukannya dengan mudah.

Perhatikan contoh-contoh berikut ini:

Menambah hari, minggu, bulan, dan tahun

Untuk menambahkan hari, minggu, bulan atau tahun, kita bisa memanfaatkan fungsi modify().

Fungsi tersebut akan merubah instan dari kelas DateTime yang menjadi induk pemanggilan fungsi tersebut.

Karena kita tidak ingin mengubah tanggal induk yang asli, maka kita akan mengkloningnya dengan perintah clone.

Perhatikan kode program berikut ini:

<?php

$hariIni = new DateTime("01-01-2020");
$tigaHariLagi = (clone $hariIni)->modify("+3 days");
$semingguLagi = (clone $hariIni)->modify("+1 week");
$tujuhMingguLagi = (clone $hariIni)->modify("+7 weeks");
$duaBulanLagi = (clone $hariIni)->modify("+2 months");
$limaBelasTahunLagi = (clone $hariIni)->modify("+15 years");

echo $hariIni->format("d-m-Y") . "<br>";
echo $tigaHariLagi->format("d-m-Y") . "<br>";
echo $semingguLagi->format("d-m-Y") . "<br>";
echo $tujuhMingguLagi->format("d-m-Y") . "<br>";
echo $duaBulanLagi->format("d-m-Y") . "<br>";
echo $limaBelasTahunLagi->format("d-m-Y") . "<br>";

Output:

01-01-2020
04-01-2020
08-01-2020
19-02-2020
01-03-2020
01-01-2035

Mengurangi hari, minggu, bulan, dan tahun

Caranya adalah sama dengan sebelumnya. Hanya saja jika ingin mengurangi, kita harus menggunakan tanda -. Perhatikan contoh berikut:

<?php

$hariIni = new DateTime("01-01-2020");
$tigaHariYangLalu = (clone $hariIni)->modify("-3 days");
$semingguYangLalu = (clone $hariIni)->modify("-1 week");

echo $hariIni->format("d-m-Y") . "<br>";
echo $tigaHariYangLalu->format("d-m-Y") . "<br>";
echo $semingguYangLalu->format("d-m-Y") . "<br>";

Output:

01-01-2020
29-12-2019
25-12-2019

Membandingkan Tanggal dan Waktu

Sama dengan yang kita lakukan pada tutorial sebelumnya, dengan menggunakan DateTime kita bisa membandingkannya dengan operator perbandingan. Entah itu kurang dari (<), atau lebih dari (>), sama dengan (=), atau yang lainnya.

Perhatikan contoh berikut:

<?php

$tanggal1 = new DateTime("2020-01-01");
$tanggal2 = new DateTime("2020-01-31");

if ($tanggal1 < $tanggal2) {
    echo $tanggal1->format("d-m-Y") . " < " . $tanggal2->format("d-m-Y");
} elseif ($tanggal1 === $tanggal2) {
    echo $tanggal1->format("d-m-Y") . " = " . $tanggal2->format("d-m-Y");
} else {
    echo $tanggal1->format("d-m-Y") . " > " . $tanggal2->format("d-m-Y");
}

Output:

01-01-2020 < 31-01-2020

Pembahasan Selanjutnya

Pada dua pertemuan ini, kita telah selesai membahas tentang bagaimana cara memanipulasi tanggal dan waktu pada PHP, baik dengan pendekatan prosedural mau pun dengan pendekatan OOP.

Pada pertemuan selanjutnya insyaallah kita masih akan membahas tentang tanggal dan waktu, yaitu tentang bagaimana cara menampilkan nama hari dan nama bulan dalam PHP dengan Bahasa Indonesia.


3. Hari dan Bulan (Indonesia)

PHP: Menampilkan Hari dan Bulan Dalam Bahasa Indonesia

Pendahuluan

Pada dua pertemuan sebelumnya, kita telah mempelajari bagaimana cara menampilkan nama hari dan nama bulan dengan PHP. Baik menggunakan pendekatan prosedural dengan fungsi date(), atau dengan pendekatan objek menggunakan kelas bawaan PHP bernama DateTime.

Perhatikan contoh berikut:

<?php

# pendekatan prosedural
echo date('D M y, H:i') . '<br>';

# pendekatan objek
$hariIni = new DateTime();
echo $hariIni->format('l F Y, H:i') . '<br>';

Kedua kode program di atas, ketika saya eksekusi, menghasilkan output sebagai berikut:

Thu Feb 20, 17:27
Thursday February 2020, 17:27

Nah permasalahannya adalah, nama hari dan bulannya ditulis dalam Bahasa Inggris. Sedangkan kita inginnya agar nama hari dan nama bulan tersebut ditulis dalam Bahasa Indonesia, seperti ini:

Kamis 20 Februari 2020, 17:27
Kam 20 Feb 2020, 17:27

Bagaimana caranya?

Dalam tutorial ini, insyaallah kita akan membahas beberapa cara yang bisa kita lakukan untuk menampilkan nama hari dan nama bulan dalam Bahasa Indonesia.

Solusi 1: Mengganti Lokalisasi PHP (Direkomendasikan)

Cara yang pertama adalah dengan mengganti lokalisasi PHP kita menjadi berbahasa Indonesia. Menurut Wikipedia Bahasa Indonesia, kata locale dalam Bahasa Inggris bisa diterjemahkan dengan kata “lokalisasi” atau bisa juga diterjemahkan dengan “pelokalan” [1].

Ia adalah suatu istilah komputer untuk penyesuaian terjemahan bahasa suatu perangkat lunak ke bahasa lokal agar bisa lebih mudah digunakan oleh penduduk. Tidak hanya terjemahan saja, tapi lokalisasi komputer juga berkaitan dengan hal yang lain seperti: format mata uang, format penulisan angka, dan format tanggal dan waktu pada suatu daerah tertentu.

Nah, dengan mengganti lokalisasi PHP menjadi Bahasa Indonesia, kita tidak perlu melakukan perubahaan yang berarti pada kode program kita. Kode program kita tetap seperti sediaka kala tanpa melakukan tambahan yang panjang lagi rumit.

Bagaimana caranya?

Pastikan sistem operasi kita mendukung lokalisasi Bahasa Indonesia

Umumnya, semua sistem operasi mendukung lokalisasi dari berbagai bahasa dunia. Termasuk Indonesia.

Akan tetapi, perlu dipastikan bahwa lokalisasi tersebut sudah terpasang pada sistem yang kita gunakan: baik Windows, mau pun unix-based seperti Linux atau Mac OS.

Lokalisasi tersebut tidak perlu aktif sebagai lokalisasi utama, kita tetap bisa menggunakan Bahasa Inggris pada sistem kita dan di saat yang sama Bahasa Indonesia juga dalam keadaan terpasang.

Periksa Lokalisasi Aktif Pada Linux

Jika kita menggunakan linux, kita bisa memeriksa lokalisasi yang aktif pada sistem kita menggunakan perintah berikut:

locale -a

Pada Ubuntu yang saya gunakan, output yang saya dapatkan adalah seperti ilustrasi berikut:

C
C.UTF-8
en_AG.utf8
...
en_US.utf8
...
id_ID.utf8
POSIX

Di dalam daftar locales yang terpasang di sistem yang saya gunakan adalah: id_ID.utf8 yang menunjukkan bahwa ia adalah Bahasa Indonesia.

Menambahkan Lokalisasi Bahasa Indonesia di Linux

Jika di sistem atau server yang anda gunakan ternyata belum terpasang lokalisasi Bahasa Indonesia, anda perlu memasangnya terlebih dahulu.

Memasang Lokalisasi di Ubuntu

Untuk pengguna Ubuntu, anda bisa melakukan perintah berikut:

sudo locale-gen id_ID
sudo locale-gen id_ID.UTF-8

Lalu update lokalisasi dengan perintah:

sudo update-locale

Mengganti Lokalisasi PHP

Untuk mengganti lokalisasi pada PHP, kita bisa menggunakan perintah setlocale. Perhatikan kode program berikut:

<?php

setlocale(LC_ALL, 'id_ID');

// atau

setlocale(LC_ALL, 'id_ID.utf8'); // tergantung dengan lokalisasi yang terpasang pada sistem

NB: untuk pengguna windows, anda bisa menggunakan kode id_ID untuk Bahasa Indonesia sesuai dengan Language Identifier Constants and Strings dan juga kaidah penamaan kode bahasa pada halaman Language and Country/Region Strings.

Menampilkan Nama Hari dan Bulan Dalam Bahasa Indonesia

Langkah selanjutnya adalah menampilkan nama hari dan bulan dengan Bahasa Indonesia.

Kita punya satu masalah, bahwasanya fungsi date() mau pun fungsi DateTime::format() tidak mendukung pelokalan sistem. Ia hanya bisa menampilkan format tanggal dalam Bahasa Indonesia saja.

Sebagai alternatifnya, kita bisa menggunakan fungsi strftime() untuk menampilkan format tanggal sesuai dengan lokalisasi yang telah diatur. Fungsi strftime() menerima dua parameter:

  • Format: yaitu kode tertentu yang merepresentasikan bagaimana tanggal dan waktu akan ditampilkan. Ia memiliki kode yang berbeda dengan fungsi date() mau pun DateTime::format().
  • Timestamp: yaitu jarak antara suatu waktu dari tanggal 1 Januari 1970 dalam satuan detik.

Perhatikan contoh lengkap berikut:

<?php

setlocale(LC_TIME, 'id_ID.utf8');

$hariIni = new DateTime();

# lokalisasi tidak berpengaruh
echo $hariIni->format('l F Y, H:i') . '<br>';
echo $hariIni->format('D M y, H:i') . '<br>';

echo "<br>";

# lokalisasi berpengaruh
echo strftime('%A %d %B %Y, %H:%M', $hariIni->getTimestamp()) . '<br>';
echo strftime('%a %d %b %Y, %H:%M', $hariIni->getTimestamp()) . '<br>';

Kode program di atas akan menampilkan hasil kira-kira seperti berikut ini (tergantung kapan kode program tersebut dieksekusi):

Thu Feb 20, 17:27
Thursday February 2020, 17:27
Kamis 20 Februari 2020, 17:27
Kam 20 Feb 2020, 17:27

Format Tanggal dan Waktu untuk fungsi strftime()

Fungsi strftime() mengikuti format tanggal dan waktu yang berbeda dari fungsi date() mau pun fungsi DateTime::format().

Ini memang agak sedikit membingungkan. Akan tetapi cara kerjanya sama persis. Pun, kita tidak perlu menghafal setiap formatnya, kok.

Berikut ini beberapa format umum yang mungkin anda butuhkan.

Kode format hari

Beberapa kode format hari yang sering digunakan di dalam bahasa pemrograman PHP.

KodeKeteranganNilai Kembalian
dUrutan hari dalam bulan, diikuti angka 0 untuk hari < 1001-31
eUrutan hari dalam bulan, tidak diikuti angka 01-31
aNama hari, hanya 3 karakter. Nama hari sesuai dengan pilihan lokalisasiMon - Sun
ANama hari secara penuh. Nama disesuaikan dengan pilihan lokalisasiSunday - Saturday

Kode format bulan

Beberapa kode format bulan yang sering digunakan di dalam bahasa pemrograman PHP.

KodeKeteranganNilai Kembalian
mUrutan bulan dalam tahun, diikuti angka 0 untuk hari < 1001-12
bNama pendek dari suatu bulan, hanya 3 karakter. Nama disesuaikan dengan pilihan lokalisasiJan-Dec
BNama lengkap dari suatu bulan. Nama disesuaikan dengan pilihan lokalisasiJanuary - December

Kode format tahun

Beberapa kode format tahun yang sering digunakan di dalam bahasa pemrograman PHP.

KodeKeteranganNilai Kembalian
YMenampilkan 4 digit tahunContoh: 1990 - 2030
yMenampilkan hanya 2 digit terakhir dari tahunContoh: 90 - 30

Kode format waktu

Beberapa kode format waktu yang sering digunakan di dalam bahasa pemrograman PHP.

KodeKeteranganNilai Kembalian
IJam dalam format 12-hour01-12
HJam dalam format 24-hour01-24
PLowercase Ante meridiem and Post meridiemam-pm
pUppercase Ante meridiem and Post meridiemAM-PM
MMenit dengan diikuti angka 001-59
SDetik dengan diikuti angka 001-59

Solusi 2: Terjemah Manual Dengan Percabangan Switch-Case

Cara yang kedua adalah dengan membuat fungsi percabangan switch case dan melakukan penerjemahan secara manual.

Dan ini adalah cara yang saya kurang sukai karena ia menambah pekerjaan. Karena kita membuat sesuatu yang sama dengan apa yang sebenarnya sudah ada secara default. Bahkan yang default jauh lebih bagus dari pada buatan kita.

Tapi untuk belajar dan mengasah logika, cara yang kedua ini tidak ada salahnya sama sekali bahkan bisa membantu proses belajar kita untuk menjadi programmer PHP yang handal.

Silakan perhatikan contoh berikut:

<?php

function hariIndo ($hariInggris) {
  switch ($hariInggris) {
    case 'Sunday':
      return 'Minggu';
    case 'Monday':
      return 'Senin';
    case 'Tuesday':
      return 'Selasa';
    case 'Wednesday':
      return 'Rabu';
    case 'Thursday':
      return 'Kamis';
    case 'Friday':
      return 'Jumat';
    case 'Saturday':
      return 'Sabtu';
    default:
      return 'hari tidak valid';
  }
}

Lalu kita bisa panggil fungsi di atas sebagai berikut:

<?php

$hariBahasaInggris = date('l');
$hariBahasaIndonesia = hariIndo($hariBahasaInggris);

echo "Bahasa Inggris: {$hariBahasaInggris} <br>";
echo "Bahasa Indonesia: {$hariBahasaIndonesia} <br>";

Output dari kode program di atas adalah:

Bahasa Inggris: Thursday
Bahasa Indonesia: Kamis

Solusi 3: Menggunakan Pustaka Pihak Ketiga

Solusi yang ketiga adalah menggunakan pustaka pihak ketiga yang bernama Carbon. Ia adalah pustaka PHP yang menyederhakan pekerjaan programmer ketika harus berhadapan dengan tanggal dan waktu.

Cara ini sebenarnya adalah cara yang paling saya rekomendasikan untuk digunakan pada projek betulan. Akan tetapi pada seri tutorial php tingkat menengah ini, saya kira cara yang pertama masih cara yang paling sesuai untuk dilakukan.

Sebagai gambaran, dengan menggunakan Carbon, anda cukup menuliskan kode program seperti berikut ini:

<?php

# tanggal sekarang dalam bahasa indo
$hariIni = \Carbon\Carbon::now()->locale('id');

# tampilkan nama bulan
echo $hariIni->monthName; # Februari

Kesimpulan

Dalam pertemuan ini, kita telah membahas 3 cara untuk menampilkan nama hari dan nama bulan di PHP dalam Bahasa Indonesia.

Cara yang pertama adalah dengan melakukan pengaturan lokalisasi, dan ini adalah cara yang direkomendasikan. Cara yang kedua adalah dengan melakukan penterjemahan manual memanfaatkan logika percabangan switch case. Dan cara yang ketiga adalah dengan menggunakan pustaka pihak ketiga yaitu Carbon.

Pembahasan Selanjutnya

Insyaallah pada pembahasan selanjutnya pada seri tutorial PHP tingkat menengah ini kita akan membahas tentang ruang lingkup variabel dan apa itu variabel global.

Jangan lupa share tutorial PHP ini ke kawan-kawan kalian, ya!

Terima kasih banyak!

Referensi

[1] https://id.wikipedia.org/wiki/Internasionalisasi_dan_pelokalan



4. Include dan Require

PHP: Pembahasan Tentang Include Dan Require

Kita masih berada pada seri tutorial belajar PHP tingkat menengah, ini adalah pertemuan ke-4. Pada pertemuan-pertemuan sebelumnya kita telah membahas hal-hal yang berkaitan dengan tanggal dan waktu, baik dengan pendekatan prosedural mau pun pendekatan objek. Kita juga telah membahas tentang cara menampilkan tanggal dan waktu dalam bahasa Indonesia.

Pada pertemuan kali ini, kita akan membahas sesuatu yang berbeda dan tidak kalah penting dengan pembahasan sebelumnya. Yaitu pembahasan tentang perintah include dan require.

Apa Itu Include dan Require?

include dan require adalah dua fungsi atau dua perintah dalam PHP yang bertugas untuk memuat suatu file PHP, di dalam file PHP yang lain.

Secara umum kedua perintah tersebut memiliki tugas yang sama. Hanya saja, dari segi error, keduanya memiliki perbedaan:

  1. Jika file yang di-load ternyata tidak ada, perintah include akan tetap mengeksekusi baris kode program selanjutnya.
  2. Sedangkan jika file yang di-load dengan fungsi require ternyata tidak ada, maka ia akan berhenti di mana fungsi require tersebut dipanggil, dan tidak melanjutkan pengeksekusian kode program berikutnya.

Kenapa Perlu Fungsi Include dan Require?

Alasannya adalah: ketika program yang kita bangun semakin besar, maka ada semakin banyak fungsi atau konten halaman yang butuh kita panggil atau tampilkan berkali-kali di berbagai tempat. Dari pada mendefinisikan fungsi atau halaman tersebut secara berulang, kita lebih baik hanya mendefinisikannya sekali saja, untuk kemudian memanggilnya dari berbagai tempat dari file yang berbeda-beda.

Misalkan kita memiliki sebuah projek web profil, kita memiliki 3 halaman utama yaitu index.phpabout.php, dan contact.php.

Ketiga halaman tersebut semuanya memiliki header, footer, dan navbar yang sama. Sehingga dari pada kita membuat 3 header untuk masing-masing halaman, begitu juga 3 buah footer, dan 3 buah navbar. Lebih baik kita hanya membuat satu komponen saja, yang komponen tersebut akan dimuat di halaman-halaman yang membutuhkannya.

Di situlah kita membutuhkan fungsi include dan require.

Persiapan File

Agar lebih jelas lagi, mari kita buat file seperti berikut ini:

├── partials
|   ├── footer.php
|   ├── header.php
|   └── navbar.php
├── about.php
├── contact.php
└── index.php

Lalu ubah 3 file di dalam direktori partials masing-masing menjadi seperti di bawah:

  1. File partials/footer.php

    <?php
    
    $tahunSekarang = date("Y");
    
    echo "Copyright &copy; {$tahunSekarang} jagongoding.com";
    
  2. File partials/header.php

    <?php
    
    echo "<h1>Selamat datang di Jago Ngoding</h1>";
    
  3. File partials/navbar.php

    <nav>
      <a href="index.php">Home</a>
      <a href="about.php">About</a>
      <a href="contact.php">Contact</a>
    </nav>
    

Kita katakan bahwa 3 buah halaman utama di atas yaitu about.phpcontact.php, dan index.php, masing-masing memuat file yang ada dalam direktori partials mulai dari footer, header, hingga navbar.

Sehingga ketika misalkan kita ingin mengubah footer di 3 halaman tersebut, kita cukup mengubah satu file saja yaitu partials/footer.php. Dan boom! Konten footer di 3 halaman utama langsung ikut berubah semuanya.

Nah, bagaimana cara melakukannya?

Contoh Penggunaan include dan require

Ada dua macam cara penggunaan include dan require. Cara yang pertama adalah memanggilnya seperti kita memanggil fungsi: yaitu dengan tanda kurung. Sedangkan cara yang kedua adalah memanggilnya sebagai statement seperti saat kita memanggil echo.

Cara pertama (contoh file index.php):

<?php
# file index.php

require('partials/navbar.php');
include('partials/header.php');

echo "<div>Ini adalah halaman utama</div>";

require('partials/footer.php');

Cara kedua (contoh file about.php):

<?php
# file about.php

require 'partials/navbar.php';
include 'partials/header.php';

echo "<div>Ini adalah halaman about</div>";

require 'partials/footer.php';

Sepertinya cara kedua nampak lebih cantik buat saya. Setuju atau tidak?

Anda bisa ubah sendiri konten untuk file contact.php agar sama seperti index.php dan about.php. Lalu coba jalankan aplikasi pada browser, dan lihat bagaimana hasilnya.

Contoh Penggunaan include_once dan require_once

Fungsi alternatif dari include dan require adalah: include_once dan require_once.

Dua fungsi tersebut hanya akan me-load file satu kali saja. Artinya jika file tersebut sudah di-load sebelumnya, dia tidak akan di-load lagi di file yang sama.

Perhatikan dua contoh kode program berikut ini:

<?php

include 'partials/header.php';
include 'partials/header.php';

Kode program di atas akan memuat file partials/header.php sebanyak dua kali. Artinya: file header akan ditampilkan dua kali juga. Berbeda dengan jika kita memanggilnya dengan include_once atau require_once, sebanyak apa pun kita memanggil file yang sama, ia akan tetap dimuat satu kali saja.

<?php

include_once 'partials/header.php';
include_once 'partials/header.php';

Memuat File Dari Parent Direktori Yang Berbeda

Dalam contoh kasus di atas, kita bisa me-load file dengan mudah karena ia masih berada di satu direktori parent yang sama. Bagaimana kalau kita ingin memuat file dari direktori parent yang lainnya?

Oke, bayangkan kita memiliki struktur seperti berikut:

├── partials
|   ├── footer.php
|   ├── header.php
|   └── navbar.php
├── articles
|   ├── article-1.php
|   ├── article-2.php
├── about.php
├── contact.php
└── index.php

Bayangkan kita sekarang berada pada file articles/article-2.php. Lalu kita ingin memuat file navbar dan footer yang berada pada direktori partials. Bagaimana caranya?

Caranya adalah: kita harus keluar dulu dari direktori file yang kita edit menggunakan alamat .., lalu setelah itu kita definisikan lokasi nama file yang ingin kita muat.

Perhatikan contoh file articles-2.php berikut:

<?php

require_once '../partials/navbar.php';

// konten article-2

require_once '../partials/footer.php';

Memanggil Fungsi Dari File Lain

Secara umum, jika kita meng-include atau me-require suatu file dan di dalamnya terapat suatu fungsi, kita langsung bisa memanggilnya. Misalkan kita memiliki file seperti berikut:

├── bantuan
|   ├── fungsi-luas-bangun-ruang.php
|   ├── fungsi-volume-bangun-ruang.php
└── index.php

File bantuan/fungsi-luas-bangun-ruang.php:

<?php

function hitungLuasPermukaanBalok (float $p, float $l, float $t) {
  return ($p * $l * 2) + ($p * $t * 2) + ($l * $t * 2);
}

File bantuan/fungsi-volume-bangun-ruang.php:

<?php

function hitungVolumeBalok (float $p, float $l, float $t) {
  return $p * $l * t;
}

Nah, pada file index.php, kita akan memanggil 2 fungsi hitungLuasPermukaanBalok() dan hitungVolumeBalok() yang berada pada file yang berbeda.

Caranya mudah saja, kita tinggal meng-include atau me-require-nya, setelah itu kita langsung bisa memanggil 2 fungsi tersebut.

Perhatikan kode program file index.php berikut:

<?php
require_once 'bantuan/fungsi-luas-bangun-ruang.php';
require_once 'bantuan/fungsi-volume-bangun-ruang.php';

$panjang = 10;
$lebar = 5;
$tinggi = 3;

echo "Luas permukaan: " . hitungLuasPermukaanBalok($panjang, $lebar, $tinggi) . "<br>";
echo "Volume: " . hitungVolumeBalok($panjang, $lebar, $tinggi) . "<br>";

Memanggil Variabel Dari File Lain

Sama saja seperti fungsi, kita juga bisa memanggil variabel dari file yang kita include atau kita require. Hanya saja, untuk variabel, ada ruang lingkupnya. Ada variabel yang bersifat lokal, dan ada variabel yang bersifat global.

Insyaallah kita akan mengambil pembahasan tentang ruang lingkup variabel pada pertemuan selanjutnya.

Mana Yang Harus Digunakan Include atau Require?

Seperti yang sudah kita singgung sebelumnya, bahwa include dan require sebenarnya sama saja. Yang membedakan keduanya adalah error yang dihasilkan jika file yang dimuat ternyata tidak ada.

include akan memproduksi error warning, yang mana kode program selanjutnya masih akan tetap dieksekusi.

Sedangkan require akan memproduksi fatal error yang akan memberhentikan alur kerja program yang artinya kode program selanjutnya tidak akan pernah dieksekusi.

Pertanyaan, kapan harus menggunakan include dan kapan harus menggunakan require?

Untuk lebih amannya, lebih baik kita hanya menggunakan require saja. Apalagi kalau projek yang kita kerjakan sudah semakin besar. Hal ini akan memudahkan kita mendeteksi error jika terjadi error, dan mengurangi celah keamanan dari projek yang kita bangun.

Pembahasan Selanjutnya

Setelah mempelajari bagaimana cara memuat suatu file PHP di dalam file PHP yang lain, insyaallah di pertemuan yang akan datang kita akan membahas tentang variabel. Yaitu tentang ruang lingkupnya, apa itu variabel lokal dan apa itu variabel global, serta variabel-variabel bawaan PHP.


5. Ruang Lingkup Variabel

PHP: Ruang Lingkup Variabel (Global, Lokal dan Statis)

Pada tutorial PHP dasar yang lalu, kita telah mempelajari dasar-dasar tipe data dan variabel, mulai dari peraturan penamaan variabel, cara pembuatan dan penggunannya.

Akan tetapi, kita masih baru di dasar-dasarnya saja, pada tutorial PHP tingkat menengah ini, kita akan memperdalam pelajaran kita: yaitu tentang ruang lingkup variabel di PHP dan jenis-jenis variabel ditinjau dari ruang lingkupnya.

Apa itu Ruang Lingkup Variabel?

Ruang lingkup variabel adalah jangkauan akses variabel tersebut.

Ada variabel yang bersifat global: ia bisa diakses dari bagian program mana pun dari berbagai file.

Ada variabel yang bersifat lokal: ia hanya bisa diakses oleh sebagian kode program tertentu dan tidak bisa diakses dari bagian yang lain.

Ada variabel yang bersifat statis: ia variabel yang bersifat tunggal, di mana pun ia berada, berapa kali pun ia dideklarasi, ia tetap dianggap satu.

Kita akan bahas masing-masing jenis variabel dalam tutorial ini.

Variabel Global

Seperti yang sudah disinggung sebelumnya: bahwa variabel global adalah variabel yang selalu bisa diakses kapan pun dan di mana pun. Bahkan dari file yang berbeda sekalipun.

Secara default, ketika kita mendeklarasikan variabel, variabel tersebut memiliki scope atau ruang lingkup global. Bisa diakses dari mana saja dari semua bagian kode program.

Sebagai contoh, katakanlah kita memiliki file seperti ini:

src
├── file-01.php
├── file-02.php
└── file-utama.php

File file-01.php memiliki sebuah variabel, yaitu variabel $nama yang secara otomatis ia memiliki ruang lingkup global. Perhatikan contoh berikut:

<?php

$nama = 'Nurul Huda'; // <-- variabel global

echo "file-01.php <br>";
echo "Nama: {$nama} <br><br>";

Sedangkan file-02.php, ia tidak mendeklarasikan variabel $nama sebelumnya. Akan tetapi ia meng-echo variabel $nama. Perhatikan kode program berikut:

<?php

echo "file-02.php <br>";
echo "Nama: {$nama} <br><br>";

// bahkan kita juga bisa mengubah isi dari variabel
// yang dideklarasikan di file yang lain

$nama .= ' bin Zakariyya';

Apakah bisa file-02.php menampilkan variabel $nama? Silakan anda jalankan, dan anda akan mendapati bahwa variabel $nama kosong karena di dalam file tersebut variabel $nama tidak pernah didefinisikan sebelumnya.

Bahkan, anda justru akan mendapatkan error PHP Notice: Undefined variable: nama in file-02.php.

Akan tetapi, ketika anda menggabungkan file-01.php dan juga file-02.php dengan perintah require, error yang sebelumnya ada pada file-02.php tidak akan anda jumpai lagi karena sekarang semua variabel yang kita definisikan pada file-01.php bersifat global dan bisa diakses dari file lain yang memuatnya dengan include() mau pun require().

Perhatikan file-utama.php berikut:

<?php

require 'file-01.php';
require 'file-02.php';

echo "file-utama.php <br>";
echo "Nama: {$nama} <br><br>";

Ketika kita jalankan file-utama.php, output yang kita dapatkan adalah:

file-01.php
Nama: Nurul Huda

file-02.php
Nama: Nurul Huda

file-utama.php
Nama: Nurul Huda bin Zakariyya

Masih ada beberapa pembahasan lagi mengenai variabel global, pembahasannya akan kita akhirkan setelah pembahasan tentang variabel lokal.

Variabel Lokal

Beda dengan variabel global, variabel lokal tidak bisa diakses dari mana pun. Ia hanya bisa diakses dari scope di mana ia didefinisikan.

Dalam PHP, setiap variabel yang dideklarasikan di dalam sebuah fungsi, maka ia secara otomatis didefinisikan secara lokal. Dalam artian ia tidak bisa diakses di luar fungsi.

Perhatikan contoh berikut:

<?php

function haloDunia () {
  $nama = "Nurul Huda";
}

haloDunia(); /* panggil fungsi haloDunia() */

echo $nama; /* error karena variabel $nama dalam fungsi haloDunia() bersifat lokal */

Atau, contoh sebaliknya:

<?php

$nama = "Nurul Huda"; /* variabel ini secara default bersifat global */

function haloDunia () {
  echo $nama; /* sedangkan ini tereferensikan ke variabel lokal */
}

haloDunia();

Sehingga ketika program di atas kita eksekusi, hasilnya adalah kosong atau bahkan error. Karena variabel $nama yang berusaha kita echo di dalam fungsi haloDunia() merujuk pada variabel lokal, alias variabel $nama yang ada di dalam fungsi tersebut. Sedangkan di dalam fungsi tersebut tidak ada variabel $nama sehingga hal tersebut membuat error Undefined variabel nama.

Bahkan, jika variabel global dan variabel lokal memiliki nama yang sama, ia tetap tidak tercampur satu sama lain. Perhatikan contoh berikut:

<?php

$nama = "Nurul Huda"; /* variabel global */

function haloDunia () {
  $nama = "Wahid Abdullah"; # variabel lokal
  echo $nama . '<br>'; # Wahid Abdullah
}

haloDunia();

echo $nama; # Nurul Huda

Output kode program di atas adalah:

Wahid Abdullah
Nurul Huda

Statement global

Lalu bagaimana jika kita ingin mereferensikan variabel global dalam sebuah fungsi? Sedangkan fungsi dalam PHP secara asal akan membuat scope-nya sendiri yang terpisah dengan variabel global?

Caranya adalah menggunakan statement global.

Perhatikan contoh berikut:

<?php

$a = 5;
$b = 3;

function luas () {
  global $a, $b;

  $b = $a + $b;
}

luas();

echo "a = {$a} <br>";
echo "b = {$b} <br>";

Ketika program di atas dieksekusi, ia akan menghasilkan output sebagai berikut:

a = 5
b = 8

Variable $_GLOBALS

Selain menggunakan statement global. Kita juga bisa menggunakan variabel bawaan PHP bernama $_GLOBALS. Ia adalah variabel bertipe data array asosiatif dengan variabel global sebagai key-nya dan nilai dari variabel global sebagai value-nya.

Mari kita ubah kode program di atas menjadi seperti ini:

<?php

$a = 5;
$b = 3;

function luas () {
  $_GLOBALS['b'] = $_GLOBALS['a'] + $_GLOBALS['b'];
}

luas();

echo "a = {$a} <br>";
echo "b = {$b} <br>";

Ketika program di atas dieksekusi, ia akan menghasilkan output sebagai berikut:

a = 5
b = 8

Variabel Statis

Di antara hal yang penting berkaitan dengan variable scope atau ruang lingkup variabel pada PHP adalah: variabel statis.

Variabel statis atau static variable adalah variabel lokal yang hanya khusus didefinisikan dalam sebuah fungsi. Akan tetapi, ia tetap mempertahankan nilainya dalam scope tersebut meskipun eksekusi program telah melewatinya.

Untuk lebih jelasnya, perhatikan kode program berikut:

<?php

function tes () {
  $a = 0; # mendefinisikan variabel lokal

  echo "a: {$a} <br>";

  $a++; # increment variabel lokal
}

tes();
tes();
tes();

Jika dieksekusi, program di atas akan menghasilkan output seperti berikut:

a: 0
a: 0
a: 0

Kenapa nilai 0 tidak berubah padahal kita selalu men-increment-nya?

Itu karena variabel lokal, ketika program telah melewati ruang lingkupnya, ia akan dihapus.

Dan ketika fungsi tersebut dipanggil lagi, ia akan kembali membuat sebuah variabel lokal dengan nama $a dan memberinya nilai 0. Oleh karena itu meskipun kita memanggil fungsi tes() sebanyak 3 kali, itu tidak berpengaruh sama sekali.

Sedangkan dengan static variable, variabel lokal tersebut tetap bisa mempertahankan nilainya sekalipun eksekusi program telah melewatinya.

Ubah kode program di atas menjadi seperti ini:

<?php

function tes () {
  static $a = 0; # mendefinisikan variabel lokal

  echo "a: {$a} <br>";

  $a++; # increment variabel lokal
}

tes();
tes();
tes();

Jika dieksekusi, program di atas akan menghasilkan output seperti berikut:

a: 0
a: 1
a: 2

Pembahasan Selanjutnya

Setelah selesai dengan pembahasan ruang lingkup variael pada PHP beserta jenis-jenisnya, insyaallah pada pertemuan yang akan datang kita akan membahas beberapa variabel global bawaan PHP yang bisa kita gunakan.

Ikuti dan nantikan terus seri tutorial ini, jangan lupa share dan tinggalkan komentar, ya!

Terima kasih banyak.

Referensi

https://www.php.net/manual/en/language.variables.scope.php


6. Variabel Super Global

PHP: Variabel Super Global

Pada pertemuan sebelumnya di seri tutorial PHP tingkat menengah, kita telah mempelajari tentang ruang lingkup variabel mulai dari variabel global, lokal, dan statis.

Selain 3 jenis itu, di dalam PHP sebenarnya masih terdapat satu jenis variabel yang lain: yaitu variabel super global.

Apa itu Variabel Super Global di PHP?

Variabel super global di PHP adalah variabel bawaan yang bersifat global. Variabel bawaan yang dimaksud adalah: variabel yang sudah otomatis ada tanpa perlu kita definisikan sendiri. Dan ia bersifat global dalam artian bisa kita akses dari mana pun dan kapan pun.

Variabel super global menyimpan banyak sekali data penting dan juga bermanfaat yang bisa kita gunakan dalam menyelesaikan projek yang sedang kita kerjakan.

Setidaknya terdapat 9 variabel super global di PHP. Dan pada tutorial ini, kita hanya akan mempelajari dasar-dasarnya saja dan mengambil beberapa contoh ringan jika diperlakukan.

Ada pun untuk detil masing-masing penggunaannya, insyaallah akan kita pelajari pada seri tutorial PHP berikutnya.

1. Variabel $_SERVER

Variabel yang pertama dan utama adalah variabel $_SERVER. Ia adalah sebuah array asosiatif yang menyediakan berbagai macam informasi tentang request yang ditangkap oleh server. Data yang dimuat berupa headerspaths, lokasi skrip, dan sebagainya.

Nilai yang tersimpan pada variabel $_SERVER disediakan oleh web server, oleh karena itu tidak ada jaminan khusus bahwa setiap web server yang kita gunakan akan memberikan semua data-data standar yang ada.

Untuk bisa mengetahui nilai apa saja yang tersedia pada variabel $_SERVER, kita bisa mengeksekusi perintah berikut:

<?php

echo json_encode($_SERVER);

Berikut ini output yang saya dapatkan setelah menginstall ekstensi JSON View pada google chrome yang saya gunakan:

Sebagai penjelasan, pada tabel berikut ini adalah beberapa contoh data pada variabel $_SERVER yang mungkin akan sering anda butuhkan:

Tabel detail variabel $_SERVER

2. Variabel $_GET

Variabel $_GET adalah array asosiatif yang berisi nilai dari query string.

Misalkan kita memiliki file halo-dunia.php sebagaimana berikut:

<?php

$nama = @$_GET['nama']; # tanda @ agar tidak ada peringatan error ketika key-nya kosong
$usia = @$_GET['usia']; # tanda @ agar tidak ada peringatan error ketika key-nya kosong

echo "Halo {$nama}! Apakah benar anda berusia {$usia} tahun?";

Jika kita mengakses file tersebut dengan query string http://localhost/halo-dunia.php?nama=Budi&usia=20, maka output yang akan kita dapatkan adalah:

Halo Budi! Apakah benar anda berusia 20 tahun?

3. Variabel $_POST

Variabel $_POST mirip dengan variabel $_GET. Hanya saja data yang di-passing tidaklah melalui query string pada URL, akan tetapi pada body request. Dan request method yang dilakukan haruslah dengan metode POST. Insyaallah pembahasan tentang $_GET dan $_POST akan kita sendirikan pada pertemuan-pertemuan yang akan datang.

4. Variabel $_SESSION

Variabel $_SESSION merupakan array asosiatif yang menyimpan data sesi pengguna.

Variabel ini bisa kita gunakan untuk menyimpan user yang login pada satu sesi tertentu. Atau juga bisa digunakan untuk menyimpan data cart pada toko online.

Secara default, umur sesi pada PHP adalah 1440 detik atau 24 menit.

Mirip dengan $_SESSION, variabel $_COOKIE bisa kita gunakan untuk menyimpan suatu data yang berkaitan dengan user: misal informasi login, informasi cart pada toko online, dan sebagainya.

Bedanya, cookie adalah file berukuran kecil yang disimpan pada browser pengguna. File tersebut akan senantiasa dikirim setiap kali browser mengirimkan request ke server.

Umur cookie umumnya lebih panjang dari pada umur sesi.

6. Variabel $_REQUEST

Variabel $_REQUEST adalah array asosiatif yang menyimpan gabungan nilai dari variabel $_GET$_POST, dan $_COOKIE yang kesemuanya berhubungan dengan data yang dikirim bersamaan dengan request user.

7. Variabel $_FILES

Variabel $_FILES adalah array asosiatif yang menyimpan data file yang diunggah pengguna dalam satu request dengan metode POST atau PUT.

8. Variabel $_ENV

Variabel $_ENV adalah array asosiatif yang berisi data tentang environment yang skrip PHP berjalan di atasnya. Variabel $_ENV disediakan oleh shell yang menjalankan skrip PHP, sehingga nilainya bisa bervariasi tergantung dengan sistem operasi yang digunakan.

Di dalam framework PHP modern seperti laravel, variabel $_ENV juga digunakan untuk menyimpan hal-hal yang berkaitan dengan environment seperti nama database, password database, dan nilai lainnya untuk melakukan konfigurasi framework.

9. Variabel $GLOBALS

Variabel $GLOBALS adalah array asosiatif yang menyimpan semua variabel global yang didefinisikan saat program dijalankan. Kita telah membahas tentang variabel ini dalam pembahasan ruang lingkup variabel.

Pembahasan Selanjutnya

Sejauh ini kita telah mempelajari ruang lingkup variabel dan variabel super global pada PHP. Pada pembahasan selanjutnya insyaallah kita masih akan membahas hal-hal yang berkaitan dengan variabel: yaitu tipe data casting. Tipe data casting adalah konversi tipe data satu ke tipe data yang lain.

Bagaimana caranya? Nantikan pertemuan selanjutnya di seri tutorial php tingkat menengah ini.

Terima kasih banyak!


7. Konversi Tipe Data

PHP: Konversi Tipe Data (Eksplisit dan Implisit)


Pendahuluan

Kita ingat dari pelajaran yang telah lalu tentang tipe data dan variabel bahwa PHP tidak butuh (bahkan tidak support) pendefinisian tipe data pada suatu variabel. Kita tidak perlu menspesifikasikan tipe data apa pun terhadap variabel yang kita buat.

Semua tipe data pada suatu variabel ditentukan berdasarkan konteks data yang dimasukkan ke dalamnya. Misalkan kita memasukkan nilai string ke variabel $nama maka variabel $nama akan bertipe-data string, begitu juga jika kita memberikan nilai integer ke variabel $nama, maka variabel $nama akan dianggap bertipe-data integer.

Akan tetapi, tipe data dari suatu variabel di dalam PHP, bisa dikonversi menjadi tipe data yang lain baik secara implisit (otomatis) mau pun secara eksplisit (manual). Atau juga sering diistilahkan sebagai tipe data casting (manual) dan tipe data juggling (otomatis).

Konversi Tipe Data Secara Implisit

Konversi tipe data secara implisit sering juga disebut dengan istilah tipe data juggling. Yaitu konversi tipe data yang selesai secara otomatis oleh interpreter PHP tanpa ada campur tangan pemrogram.

Perhatikan contoh berikut:

<?php

$a = "1"; /* $a adalah string */
$a++; /* sekarang $a adalah integer (2) */
$a .= "3"; /* sekarang $a kembali menjadi string ("23") */
$a *= 0.5; /* sekarang $a berubah menjadi float (11.5) */

$b = 5 + "10 rumah"; /* $b menjadi integer (15) */
$c = 5 * "10kg beras dan 3 gram emas"; /* $c menjadi integer */

$d = 1 and "3"; /* $d bertipe data integer (1) */
$e = true and "5"; /* $e bertipe data boolean (true) */
$z = "a" and "b"; /* $z bertipe data string ("a") */

$f = "10" . "20.5"; /* $f bertipe data string (1020.25) */
$g = "10" + "20.5"; /* $g bertipe data float (30.25) */
$h = 10 + "20.5"; /* $h bertipe data float (30.5) */
$i = "10 beras" + 20.5; /* $i bertipe data float (30.5) */
$j = "beras 10" + 20.5; /* $j bertipe data float (20.5) */

Penjelasan

  • PHP akan berusaha menentukan tipe data yang cocok untuk semua variabel sesuai dengan operator dan operan
  • Jika variabel string dioperasikan dengan operator matematika (misal +, -, *, /), PHP akan berusaha mengonversinya menjadi tipe data numerik (entah integer atau float)
  • Jika string diubah menjadi integer, PHP akan mengambil karakter pertama dari string tersebut. Jika karakter pertama adalah data numerik, PHP akan melanjutkan proses konversi ke karakter setelahnya selama tidak ada karakter non-numerik yang memisahkan.
    • "10" menjadi 10
    • "10 kambing" menjadi 10
    • "123 kambing dan 10 sapi" menjadi 123
    • "kambing 10 dan sapi 3" menjadi 0
  • Operator logika (and, or) atau operator perbandingan akan mengubah data menjadi integer atau pun boolean atau apa pun tergantung dari tipe data operan yang pertama.
    • 1 and "3" menjadi integer (1)
    • true and "5" menadi boolean (true)
    • "a" and "b" menjadi string ("a")

Konversi Tipe Data Secara Eksplisit

Membiarkan kode program kita terkonversi secara otomatis –jika tidak hati-hati– bisa menyebabkan bug aneh yang kita tidak sangka-sangka sebelumnya.

Oleh karena itu, untuk kehati-hatian, kita bisa mengkonversi tiap nilai ke tipe data yang sesuai agar kode program bisa bekerja sesuai dengan yang kita inginkan.

Hal ini disebut dengan tipe data casting atau konversi tipe data secara eksplisit.

Bagaimana caranya? Perhatikan contoh berikut:

<?php

$a = "10 rumah"; /* $a bertipe data string ("10 rumah") */
$a = (int) $a; /* $a sekarang adalah integer (10) */
$a = (bool) $a; /* $a sekarang adalah boolean (true) */

$b = 100; /* $b bertipe data integer (100) */
$b = (string) $b; /* $b sekarang adalah string ("100") */

$c = (array) $b; /* $c adalah array ["100"] */

Tipe data casting yang bisa kita lakukan di dalam PHP adalah sebagai berikut:

KodeKeterangan
(int)(integer)Konversi ke integer
(float)(double)(real)Konversi ke float
(bool)(boolean)Konversi ke boolean
(string)Konversi ke string
(array)Konversi ke array
(object)Konversi ke object
(unset)Konversi ke NULL

Untuk contoh konversi array ke object, insyaallah akan kita bahas dalam pertemuan selanjutnya.

Kesimpulan

Dalam PHP, semua tipe data pada suatu variabel ditentukan berdasarkan konteks data yang dimasukkan ke dalamnya. Jika kita memasukkan nilai string ke variabel $nama maka variabel $nama akan bertipe-data string, jika kita memberikan nilai integer ke variabel $nama, maka variabel $nama akan dianggap bertipe-data integer.

Terkadang PHP akan mengkonversi tipe data satu ke tipe data yang lain jika dibutuhkan. Seperti misalkan dua tipe data yang berbeda dikenakan suatu operator matematika. Maka salah satu tipe datanya atau bahkan keduanya akan dikonversi menjadi tipe data yang sesuai. Hal ini disebut sebagai tipe data juggling.

Cara yang lain untuk mengkonversi tipe data adalah: dengan mendefinisikan secara eksplisit tipe data yang ingin kita konversi. Hal ini disebut sebagai tipe data casting.

Menggunakan tipe data casting sangat disarankan ketika kita membuat menulis kode program, hal itu agar kita bisa memastikan semua perintah yang kita tulis, akan dieksekusi sesuai dengan yang kita harapkan. Selain itu, menggunakan tipe data casting akan mencegah timbulnya bug-bug aneh yang tidak terprediksi.

Pembahasan Selanjutnya

Kita telah membahas dua jenis konversi tipe data dalam PHP: yaitu konversi secara otomatis atau tipe data juggling, dan konversi tipe data secara manual atau biasa disebut tipe data casting.

Untuk tipe data casting sendiri, kita telah mencoba berbagai macam contoh. Akan tetapi kita masih belum mencoba satu hal: yaitu konversi tipe data array ke object dan sebaliknya.

Pembahasan ini insyaallah akan kita ambil pada pertemuan selanjutnya.

Terima kasih banyak!


8. Mengenal stdClass

PHP: Mengenal stdClass

Pendahuluan

Pertemuan kali ini masih ada hubungannya dengan pertemuan yang sebelumnya tentang konversi tipe data PHP.

Pada pertemuan tersebut kita telah membahas bagaimana cara mengkonversi suatu tipe data ke tipe data lainnya baik secara otomatis (tipe data juggling) mau pun secara manual (tipe data casting).

Akan tetapi, masih ada satu hal yang belum kita bahas: yaitu konversi data array ke data objek, dan sebaliknya konversi data objek ke data array.

Perhatikan kode program berikut:

<?php

$mahasiswa = [
  'nama' => 'Nurul Huda',
  'domisili' => 'Surabaya'
];

$mahasiswa = (object) $mahasiswa;

Apa yang terjadi? Array $mahasiswa di atas akan dikonversi menjadi instan dari objek stdClass.

Apa Itu stdClass Dalam PHP?

Objek stdClass adalah objek kosong bawaan PHP. Secara asal, ia tidak memiliki attribut apa pun. Objek stdClass akan digunakan oleh interpreter PHP untuk mengkonversi tipe data non objek menjadi tipe data objek. Contohnya adalah seperti variabel $mahasiswa di atas.

Jika kita menjalankan fungsi print_r, kita akan melihat bahwa variabel $mahasiswa sekarang adalah stdClass.

<?php
echo "<pre>";
print_r($mahasiswa);
echo "</pre>";

Output:

stdClass Object
(
    [nama] => Nurul Huda
    [domisili] => Surabaya
)

Cara Mengakses Data Dari Objek stdClass

Pada array asosiatif, kita menampilkan data dengan memanggil key dari array tersebut dengan menggunakan tanda kurung siku ["key"].

Sedangkan untuk tipe data objek (termasuk stdClass), kita bisa menampilkan data-datanya dengan menggunakan tanda panah (->). Perhatikan contoh berikut:

<?php

echo "Nama: {$mahasiswa->nama} <br>";
echo "Domisili: {$mahasiswa->domisili} <br>";

Sintaksnya lebih enak dilihat, kan?

Perintah di atas akan menghasilkan output sebagai berikut:

Nama: Nurul Huda
Domisili: Surabaya

Konversi Array ke Objek

Seperti pada contoh variabel $mahasiswa di atas, kita bisa mengkonversi array ke sebuah objek menggunakan tipe data casting.

Akan tetapi, perlu diperhatikan, misalkan yang kita konversi adalah array multidimensi, maka yang akan dikonversi menjadi objek hanyalah array utamanya saja.

Perhatikan contoh berikut:

<?php

$mahasiswa = (object) [
  "nama" => "Fulan bin Fulan",
  "domisili" => "Surabaya",
  "sosial_media" => [
    "facebook" => "https://facebook.com/fulanbinfulan",
    "instagram" => "https://instagram.com/fulan.bin.fulan",
    "twitter" => "https://twitter.com/fulan_bin_fulan"
  ]
];

Pada kode program di atas, variabel $mahasiswa adalah suatu objek. Karena ketika kita pertama kali mendefinisikannya, langsung kita casting dengan perintah (object) [...].

Akan tetapi perlu diperhatikan, bahwasanya array ke-dua dalam data $mahasiswa->sosial_media, ia tetaplah array. Tidak terkonversi menjadi objek. Karena yang dikonversi menjadi objek hanyalah array utamanya saja, bukan array-array yang berada di dalamnya.

Jika kita menampilkan variabel $mahasiswa dengan perintah print_r:

<?php

echo "<pre>";
print_r($mahasiswa);
echo "</pre>";

Kita akan dapati output sebagai berikut:

stdClass Object
(
    [nama] => Fulan bin Fulan
    [domisili] => Surabaya
    [sosial_media] => Array
        (
            [facebook] => https://facebook.com/fulanbinfulan
            [instagram] => https://instagram.com/fulan.bin.fulan
            [twitter] => https://twitter.com/fulan_bin_fulan
        )

)

Lalu bagaimana jika kita ingin mengkonversi array asosiatif sosial_media?

Caranya sama saja, kita bisa melakukannya seperti berikut ini:

<?php

$mahasiswa->sosial_media = (object) $mahasiswa->sosial_media;

Jalankan lagi program print_r, maka sekarang kita saksikan bahwa data sosial_media bertipe data stdClass:

stdClass Object
(
    [nama] => Fulan bin Fulan
    [domisili] => Surabaya
    [sosial_media] => stdClass Object
        (
            [facebook] => https://facebook.com/fulanbinfulan
            [instagram] => https://instagram.com/fulan.bin.fulan
            [twitter] => https://twitter.com/fulan_bin_fulan
        )

)

Konversi Objek ke Array

Sebaliknya, kita juga bisa mengkonversi data objek ke dalam array. Caranya sama saja, kita hanya perlu mengganti sintaks (object) dengan (array).

Perhatikan contoh berikut:

<?php

$mahasiswa = (object) [
  "nama" => "Nurul Huda",
  "domisili" => "Sidoarjo"
];

$mahasiswa = (array) $mahasiswa;

Kesimpulan

Kelas stdClass dalam PHP adalah objek kosong yang digunakan ketika kita mengkonversi suatu data non-objek menjadi data objek.

Kita bisa mengakses data pada objek menggunakan tanda panah ->. Selain itu, kita juga bisa mengubah data pada stdClass sebagaimana kita mengubah data pada array.

Jika array yang kita konversi ke dalam objek ternyata bersifat multidimensi, maka hanya array utama saja yang terkonversi menjadi objek. Array-array yang lain di dalamnya tetaplah bertipe data array.

Pembahasan Selanjutnya

Insyaallah pada pembahasan selanjutnya, kita akan mengambil pelajaran tentang JSON pada PHP.

Bagaimana caranya? Ikuti terus seri tutorial PHP tingkat menengah ini, ya!


9. JSON

PHP: Bekerja Dengan JSON

Apa Itu JSON?

JSON adalah singkatan dari Javascript Object Notation.

Ia merupakan tipe data object pada bahasa pemrograman javascript. Struktur datanya jelas dan sederhana, serta mudah dibaca baik oleh mesin mau pun manusia.

Oleh karena itu, JSON merupakan cara standar untuk berkomunikasi antar dua bahasa pemrograman yang berbeda.

Bentuk penyusun utama data JSON ada 2, yaitu:

  • Objek: didefinisikan dengan tanda kurung kurawal ({})
  • Array: didefinisikan dengan tanda kurung siku ([])

Perhatikan contoh berikut:

{
  "nama": "Nurul Huda",
  "domisili": "Surabaya",
  "usia": 23,
  "wni": true,
  "hobi": [
    "Berenang", "Berlari", "Bertamasya"
  ]
}

Data JSON di atas bertipe objek karena ia diapit oleh tanda kurung kurawal ({}). Dan di dalam objek tersebut terdapat 5 buah key atau data, yaitu: namadomisili bertipe data string, usia bertipe data integer, wni bertipe data boolean, dan hobi bertipe data array.

Tidak harus selalu datang dalam bentuk objek, struktur data JSON bisa datang dalam bentuk array:

[
  { "nama": "Nurul Huda" },
  { "nama": "Renza Ilhami Risqi" },
  { "nama": "Taufan Aji" },
  { "nama": "Rahmad Dwi Oktanto" }
]

Pada contoh JSON di atas, ia adalah array yang memiliki 4 buah item. Kenapa array? Karena ia diapit oleh tanda kurung siku ([]). Masing-masing item dari array tersebut adalah objek, karena masing-masing itemnya diapit oleh tanda kurung kurawal ([]).

Parsing JSON String ke PHP

Secara kasat mata jika kita perhatikan struktur data JSON, kita akan dapati bahwa:

  • ia sangat mirip dengan struktur array asosiatif pada PHP jika datang dalam bentuk objek (yaitu dengan tanda kurung kurawal)
  • dan ia sangat mirip dengan struktur array terindeks pada PHP jika datang dalam bentuk array (yaitu dengan tanda kurung siku)

Pertanyaannya: jika kita memiliki suatu data JSON dalam bentuk string, lalu kita akan membacanya dalam PHP, bagaimana caranya?

Caranya adalah: menggunakan fungsi bawaan PHP bernama json_decode.

1. Parsing JSON ke Array PHP

Kita harus perhatikan:

  • jika objek JSON yang akan kita parsing ternyata dalam bentuk array: maka hasil konversinya akan berupa array pula.
  • Sedangkan jika data JSON yang akan kita parsing ternyata dalam bentuk objek, maka hasil konversinya (secara asal) adalah dalam bentuk objek (instan dari kelas stdClass)

Perhatikan contoh berikut:

<?php

$dataJson = "[5, 3, 4, 2, 1]";

$data = json_decode($dataJson);

echo implode(" - ", $data);

Perintah di atas akan menghasilkan output seperti berikut:

5 - 3 - 4 - 2 - 1

Baca jugaManipulasi Array Pada PHP

2. Parsing JSON ke Objek PHP

Kita coba masuk ke contoh yang kedua: jika ternyata objek JSON yang akan kita parsing datang dalam bentuk objek. Maka PHP (secara asal) akan mengkonversi data tersebut ke dalam objek juga. Lebih tepatnya ke dalam instan dari stdClass.

Perhatikan contoh berikut:

<?php

$json = '{
  "nama": "Nurul Huda",
  "domisili": "Surabaya",
  "usia": 23,
  "wni": true,
  "hobi": [
    "Berenang", "Berlari", "Bertamasya"
  ]
}';

$mahasiswa = json_decode($json);

echo "Nama: {$mahasiswa->nama} <br>";
echo "Domisili: {$mahasiswa->domisili} <br>";

echo "Hobi: " . implode(", ", $mahasiswa->hobi);

Jika program di atas dijalankan, maka akan menghasilkan output seperti berikut:

Nama: Nurul Huda
Domisili: Surabaya
Hobi: Berenang, Berlari, Bertamasya

Membuat JSON Dengan PHP

Jika kita ingin membuat data dalam bentuk JSON, kita bisa menggunakan fungsi bawaan PHP bernama json_encode. Fungsi tersebut adalah kebalikan dari fungsi json_encode: yaitu ia akan mengubah data objek atau array dalam PHP menjadi data dalam bentuk JSON.

Perhatikan contoh berikut:

<?php

$mahasiswa = [
  'nama' => 'Nurul Huda',
  'domisili' => 'Surabaya'
];

echo json_encode($mahasiswa);

Kode program di atas akan menghasilkan string JSON sebagaimana berikut:

{"nama":"Nurul Huda","domisili":"Surabaya"}

Atau untuk contoh array terindeks:

<?php

$nilaiUjian = [70, 80, 50, 90];

echo json_encode($nilaiUjian);

Maka kode program di atas akan menghasilkan output:

[70,80,50,90]

Melakukan Perulangan JSON

Misalkan anda memiliki string JSON sebagai berikut:

<?php

$listMahasiswaJSON = '[
  { "nama": "Nurul Huda" },
  { "nama": "Renza Ilhami Risqi" },
  { "nama": "Taufan Aji" },
  { "nama": "Rahmad Dwi Oktanto" }
]';

Lalu anda ingin menampilkan nama dari setiap data di atas. Caranya sangat sederhana sekali:

  1. Pertama anda parsing dulu JSON tersebut ke dalam array PHP
  2. Lalu lakukan perulangan dengan foreach atau metode perulangan yang lainnya

Perhatikan kode program berikut:

<?php

$listMahasiswaJSON = '[
  { "nama": "Nurul Huda" },
  { "nama": "Renza Ilhami Risqi" },
  { "nama": "Taufan Aji" },
  { "nama": "Rahmad Dwi Oktanto" }
]';

$listMahasiswa = json_decode($listMahasiswaJSON);

foreach ($listMahasiswa as $key => $mahasiswa) {
  echo "{$key}. Nama: {$mahasiswa->nama} <br>";
}

Output:

0. Nama: Nurul Huda
1. Nama: Renza Ilhami Risqi
2. Nama: Taufan Aji
3. Nama: Rahmad Dwi Oktanto

Latihan: Menampilkan Berita Dari NewsAPI.org

Telah kita singgung di atas bahwa JSON biasa digunakan sebagai standar pertukaran data dari 2 aplikasi yang berbeda. Bahkan jika keduanya berbeda bahasa pemrograman sekalipun.

Sebagai gambaran, kita akan coba menampilkan data berita yang disediakan oleh newsapi.org. Data yang disediakan berupa JSON. Kita akan menampilkannya dengan PHP.

Langkah-langkah:

  1. Daftar akun newsapi.org untuk mendapatkan API_KEY

  2. Perhatikan struktur data JSON dari URL berikut:

    Jangan lupa ganti API_KEY dengan api key akun anda.

  3. Berikut ini adalah penampakan struktur datanya:

  4. Deklarasikan variabel-variabel:

    <?php
    
    $kataKunci = "corona";
    $from = "2020-02-01";
    $sortBy = "publishedAt";
    $apiKey = ""; /* <-- Silakan register di newsapi.org untuk mendapatkan API_KEY */
    $language = "en";
    $alamatAPI = "http://newsapi.org/v2/everything?" .
        "q={$kataKunci}&language={$language}&from={$from}" .
        "&sortBy={$sortBy}&apiKey={$apiKey}";
    
  5. Ambil data dengan fungsi file_get_contents lalu parsing dengan perintah json_decode:

    <?php
    # ambil data json dari $alamatAPI
    $data = file_get_contents($alamatAPI);
    # parsing variabel $data ke dalam array
    $dataBerita = json_decode($data);
    
  6. Tampilkan data dengan melakukan perulangan foreach:

    <?php
    
    if ($dataBerita->status === "ok") {
        # tampilkan menggunakan perulangan
        foreach ($dataBerita->articles as $berita) {
            echo "<h3><a href='{$berita->url}'>{$berita->title}</a></h3>";
    
            if ($berita->urlToImage) {
                echo "<img style='width: 10rem' src='{$berita->urlToImage}'>";
            }
    
            echo "<p>{$berita->description}</p>";
            echo "<hr>";
        }
    }
    

Dari langkah-langkah di atas, berikut adalah hasil yang saya dapatkan:

Kesimpulan

JSON adalah struktur data bawaan dalam bahasa pemrograman javascript. Akan tetapi karena ia memiliki struktur yang sederhana dan mudah, ia dijadikan sebagai standar untuk perturakan data antar 2 aplikasi yang berbeda bahkan antar 2 bahasa pemrograman yang berbeda.

Dalam PHP: kita bisa mem-parsing JSON dengan perintah json_decode dan kita bisa membuat JSON dengan perintah json_encode.

Pembahasan Selanjutnya

Dalam pembahasan selanjutnya, insyaallah kita akan membahas tentang jenis-jenis error dalam PHP dan juga cara menanganinya.


10. Penanganan Error 1

PHP: Jenis dan Penanganan Error [1/2]

Pendahuluan

Kemunculan error saat pengembangan suatu aplikasi adalah sesuatu yang tidak-bisa-tidak. Ia pasti terjadi. Bahkan ketika aplikasi/web yang kita kerjakan sudah rilis pun, error tetap menjadi makanan sehari-hari kita. Ia pasti dan harus muncul.

Error apa pun yang muncul, harus ditangani dengan tepat. Baik ketika aplikasi masih dalam pengembangan, lebih-leibh lagi ketika aplikasi telah dilempar ke publik.

Penangan standar terhadap suatu error adalah:

  1. Menampilkan pesan permohonan maaf kepada pengguna karena terjadi error
  2. Menyimpan atau menulis log error agar bisa kita perbaiki dengan mudah
  3. Mengirim pemberitahuan secara real-time ke pemrogram agar error bisa ditangani saat itu juga

Jenis-Jenis Error Pada PHP

Di dalam PHP, terdapat beberapa jenis dan tingkatan level error. Sebagiannya error yang sangat fatal sehingga program tidak bisa dilanjutkan, sebagiannya lagi hanya bersifat peringatan sehinggax` program masih bisa dilanjutkan.

Berikut ini beberapa diantara level dan jenis error yang harus diketahui pada PHP:

KonstantaDeskripsiLevel
E_ERRORError fatal yang terjadi saat run-time program. Eksekusi skrip akan langsung dihentikan1
E_WARNINGError non-fatal yang terjadi saat run-time. Skrip (setelah terjadi error) tetap dieksekusi2
E_PARSEError yang terjadi pada saat compile-time. Error parse ini terjadi ketika interpreter PHP mendeteksi adanya sintaks error.4
E_NOTICEPemberitahuan kemungkinan error pada saat run-time. Suatu baris program bisa jadi ia normal-normal saja, tapi bisa jadi error pada keadaan tertentu.8
E_USER_ERRORError fatal yang terjadi saat run-time program. Sama dengan E_ERROR hanya saja error jenis ini dipicu oleh pemrogram dengan memanggil fungsi trigger_error()256
E_USER_WARNINGError non-fatal yang terjadi saat run-time. Sama dengan E_WARNING hanya saja error jenis ini dipicu oleh pemrogram dengan memanggil fungsi trigger_error()512
E_USER_NOTICEPemberitahuan kemungkinan error pada saat run-time. Sama dengan E_NOTICE hanya saja error jenis ini dipicu oleh pemrogram dengan memanggil fungsi trigger_error()1024

Untuk level error yang lebih lengkap, silakan merujuk ke dokumentasi manual PHP.

Cara Penanganan Error

Setiap kali menulis kode program, kita harus selalu membuat pemeriksaan pada setiap kemungkinan terjadinya error. Sehingga jika memang terjadi error pada tempat tersebut, kita bisa memberikan aksi yang tepat.

Di antara cara penanganan error yang bisa kita lakukan adalah:

  1. Menggunakan fungsi die()
  2. Memusatkan penanganan error pada satu fungsi khusus
  3. Menggunakan exception

Menggunakan Fungsi die()

Misalkan kita akan membuka dan membaca suatu file dengan PHP, kita harus memeriksa terlebih dahulu apakah file tersebut tersedia atau tidak. Jika ternyata file tidak tersedia, kita bisa menghentikan run-time program dengan memanggil fungsi die().

Perhatikan kode program berikut:

<?php

$namaFile = "/web/documents/histori.txt";

if (!file_exists($namaFile)) {
  die("File tidak ditemukan");
} else {
  $file = fopen($namaFile, "r");
  echo "File berhasil dibaca.";
}

// lanjutkan kode jika file berhasil dibaca

Pemusatan Error Handling

Selain cara menggunakan if else seperti di atas, kita bisa melakukan cara yang lebih umum yaitu dengan memusatkan error handling dalam satu fungsi saja.

Sehingga setiap kali ada error dari setiap level, fungsi tersebut akan otomatis dipanggil. Setelah itu, kita bisa memutuskan apa yang akan kita lakukan dengan error yang terjadi tersebut.

Langkah-langkahnya adalah:

1. Membuat fungsi

Langkah yang pertama adalah membuat fungsi khusus untuk menangani error.

Fungsi tersebut harus memiliki 5 buah parameter:

  • $errLevel: berisi konstanta tipa error level
  • $errMessage: berisi label/pesan dari error
  • $errFile: berisi file di mana error terjadi
  • $errLine: berisi baris di mana error terjadi

Sebelum itu, jangan lupa kita non aktifkan semua pesan error. Karena beberapa pengaturan bawaan PHP di sistem operasi tertentu pesan error akan ditampilkan secara default. Sehingga kita harus mengaturnya mandiri dengan mengubah nilai di file php.ini mau pun dengan memanggil fungsi error_reporting().

<?php

# sembunyikan semua pesan error bawaan PHP
error_reporting(0);

/**
 * Fungsi untuk menangai error.
 * 
 * Fungsi ini wajib memiliki 4 paramter dan nama parameter bisa bebas.
 */
function tanganiError ($level, $message, $file, $line) {
  echo "<div style='padding: 2rem; background: rgba(200, 0, 0, 0.5); color: white'>";
  echo    "<b>Terjadi Error</b>";
  echo    "<p>[{$level}] {$message} - {$file}:{$line}</p>";
  echo "</div>";
}

2. Mengatur fungsi tersebut sebagai error handler

Kita telah membuat fungsi tanganiError(). Fungsi tersebut menerima 5 buah parameter.

Yang harus kita lakukan selanjutnya adalah mengatur fungsi tersebut sebagai error handler. Sehingga jika terjadi error apa pun pada saat run-time, fungsi tersebut akan dieksekusi.

Untuk mengatur error handler kita bisa memanggil fungsi bawaan PHP bernama set_error_handler.

<?php

set_error_handler('tanganiError');

3. Testing error

Kita coba memicu sebuah error dengan memanggil variabel yang tidak pernah kita definisikan sebelumnya.

<?php

# variabel $tes tidak ada
echo $tes;

Setelah program dijalankan, berikut ini output yang saya dapatkan:

Menggunakan Shutdown Function

Cara di atas memang sekilas berhasil, akan tetapi cara tersebut tidak berfungsi untuk semua jenis error.

Kita telah berusaha memanggil suatu variabel yang belum pernah kita definisikan sebelumnya.

Akan tetapi jika kita memanggil sebuah fungsi yang tidak pernah didefinisikan, level error yang dihasilkan adalah: E_ERROR. Dan level ini tidak didukung oleh set_error_handler. Sehingga fungsi tanganiError() tidak pernah dipanggil.

Coba kode program berikut:

<?php

# fungsi selamatPagi() tidak pernah kita definisikan
selamatPagi();

Dan setelah dieksekusi, fungsi tanganiError() yang telah kita set sebagai error handler ternyata memang tidak dianggil. Ini tangkapan layar dari apa yang saya dapat:

Lalu bagaimana caranya?

Agar kita bisa menangani error level E_ERROR, kita punya pilihan untuk menggunakan shutdown function.

Shutdown function adalah fungsi yang akan dipanggil sesaat ketika program PHP akan selesai. Entah terjadi error E_ERROR atau tidak.

Mendaftarkan fungsi anonim sebagai shutdown function

Berikut ini contoh untuk mendaftarkan sebuah fungsi anonim sebagai shutdown function. Fungsi ini akan mengambil error terakhir yang terjadi pada saat run-time, lalu akan memanggil fungsi tanganiError() jika memang ada error.

<?php

register_shutdown_function(function () {
    if (error_get_last()) {
        # ambil error terakhir
        $error = (object) error_get_last();

        tanganiError(
            $error->type, $error->message, $error->file, $error->line
        );
    }
});

Coba panggil lagi fungsi selamatPagi():

<?php

# fungsi selamatPagi() tidak pernah didefinisikan
selamatPagi();

Hasilnya:

Sembunyikan Semua Output Ketika Terjadi Error

Kita telah berhasil menangani error E_ERROR menggunakan shutdown function. Akan tetapi, jika kita perhatikan, output apa pun sebelum terjadi error akan tetap ditampilkan.

Perhatikan kode program berikut:

<?php

echo "<h1>Selamat Datang</h1>";
echo "<h2>Ini adalah halaman utama</h2>";

# fungsi selamatPagi() tidak pernah didefinisikan
selamatPagi();

echo "<p>Semoga bermanfaat</p>";

Kode program di atas akan menghasilkan output sebagai berikut:

Menggunakan fungsi ob_start() dan ob_end_flush()

Fungsi ob_start() akan menyimpan semua output dalam internal buffer PHP. Sehingga output tidak langsung ditampilkan ke dalam browser melainkan akan ditampilkan terakhir-terakhir menjelang program PHP selesai dieksekusi.

Tambahkan fungsi ob_start() sebelum output pertama, dan panggil fungsi ob_end_flush() setelah output terakhir.

<?php

ob_start();
echo "<h1>Selamat Datang</h1>";
echo "<h2>Ini adalah halaman utama</h2>";

# fungsi selamatPagi() tidak pernah didefinisikan
selamatPagi();

ob_end_flush();

Panggil fungsi ob_end_clean() untuk menghapus output

Setelah itu, kita bisa memanggil fungsi ob_end_clean() untuk menghapus semua output yang terisimpan dalam internal buffer. Dalam artian output tersebut tidak jadi ditampilkan.

Fungsi tersebut kita panggil pada saat teradi error:

<?php

register_shutdown_function(function () {
    if (error_get_last()) {
        # ambil error terakhir
        $error = (object) error_get_last();
        
        # hapus semua output sebelum terjadi error
        ob_end_clean();

        tanganiError(
            $error->type, $error->message, $error->file, $error->line
        );
    }
});

Ketika program kita jalankan lagi, kita akan dapati semua output sebelum terjadi error, ia tidak ditampilkan.

Menangani Sintaks Error

Kita sejauh ini telah berhasil menangani berbagai macam jenis error bahkan sampai fatal error sekalipun.

Akan tetapi, kode program yang telah kita buat di atas tidak bisa menangani sintaks error. Misalkan kita menghapus satu tanda titik koma (;), program kita akan error dan fungsi penanganan error yang sudah kita buat tidak akan pernah dipanggil meskipun kita sudah membuat shutdown function.

Lalu, bagaimana cara mengatasi error E_PARSE alias sintaks error?

Caranya sama saja, yang kita perlu tahu adalah:

  1. Error handle harus tidak ada error
  2. File utama yang dieksekusi tidak boleh ada error
  3. Error sintaks harus berada di file sekunder (selain file utama)

Langsung saja kita praktikkan, kita akan pecah kode program yang telah kita buat sebelumnya menjadi 3 file sebagai berikut:

├── src/
|   ├── file-yang-error.php
|   ├── index.php
|   └── penanganan-error.php
├── ...

Penjelasan:

  1. File index.php adalah file utama, yang artinya file tersebut adalah file yang kita request (melalui browser)
  2. Semua error handling kita sendirikan di dalam file penanganan-error.php
  3. File yang berisi sintaks error (atau error apa pun lainnya) kita letakkan pada file-yang-error.php

Berikut adalah kode program file index.php:

<?php

require_once 'penanganan-error.php'; /* <-- shutdown fungsi berada di sini */

ob_start();
require 'file-yang-error.php'; /* <-- file yang berisi error */
ob_end_flush();

Nah ketika di file-yang-error.php terdapat error secara sintaks, PHP masih tetap bisa menjalankan file utama yaitu index.php dan shutdown function yang telah kita definisikan di file penanganan-error.php bisa dijalankan.

<?php

echo "<h1>Selamat Datang</h1>";
echo "<h2>Ini adalah halaman utama</h2>";

# fungsi selamatPagi() tidak pernah didefinisikan
selamatPagi() # dia juga tidak ada titik koma

echo "Halo pemirsah!";

Kode Program Lengkap

Untuk kode program lengkap pada pertemuan ini bisa anda akses di sini.

Kesimpulan

Di dalam PHP terdapat berbagai jenis level error. Mulai dari yang fatal hingga menghentikan program. Ada yang tidak sampai level tersebut sehingga program masih memungkinkan untuk dilanjutkan.

Untuk menangani error pada PHP, terdapat berbagai macam pendekatan. Dalam pertemuan di atas kita telah menggunakan setidaknya 2 buah pendekatan inti:

  • Menggunakan set_error_handler()
  • Dan Menggunakan register_shutdown_function()

Tidak hanya itu, kita juga telah berhasil menyembunyikan semua output yang di-echo sebelum terjadinya error memanfaatkan fungsi ob_start() dan ob_end_clean().

Pembahasan Selanjutnya

Pada pembahasan selanjutnya, insyaallah kita masih akan membahas tentang penanganan error. Akan tetapi menggunakan cara yang lebih modern yaitu Exception. Cara ini adalah fitur baru di PHP 5, dan pendekatan ini juga mirip dengan bahasa pemrograman modern lainnya.


11. Penanganan Exception

PHP: Penanganan Exception [2/2]

Pendahuluan

Kemunculan error saat pengembangan suatu aplikasi adalah sesuatu yang tidak-bisa-tidak. Ia pasti terjadi. Bahkan ketika aplikasi/web yang kita kerjakan sudah rilis pun, error tetap menjadi makanan sehari-hari kita. Ia pasti dan harus muncul.

Error apa pun yang muncul, harus ditangani dengan tepat. Baik ketika aplikasi masih dalam pengembangan, lebih-leibh lagi ketika aplikasi telah dilempar ke publik.

Pada pertemuan sebelumnya, kita telah mempelajari tentang error handling. Sedangkan pada pertemuan kali ini, kita akan mempelajari tentang exception handling.

Jika anda pernah belajar bahasa pemrograman lain sebelumnya, mungkin anda kira kedua hal tersebut sama saja. Tapi di PHP, keduanya (dulu) adalah dua hal yang berbeda.

Apa itu Exception?

Exception adalah cara baru untuk menangani error pada PHP. Ia menggunakan pendekatan OOP (Object Oriented Programming) berbeda dengan sebelumnya (versi < 5) yang mana pendekatan yang dilakukan masih prosedural.

Exception secara bahasa berarti pengecualian. Sedangkan secara istilah di dalam PHP, ia adalah sebuah perubahan alur program dari kondisi normal ke kondisi tertentu (atau pengecualian tertentu) jika terjadi suatu error (exception).

Bisa kita katakan: exception adalah bagian kode program yang membutuhkan perlakuan khsusus karena ia berjalan tidak sesuai dengan yang seharusnya.

Exception pertama kali datang pada PHP versi 5 sebagai basis kelas dari semua Exception. Dan sejak PHP versi 7, ia adalah basis kelas untuk semua user-error level [1].

Error Handling vs Exception Handling

Sebelum PHP 7, Error handling dan exception handling bisa dikatakan adalah dua hal yang berbeda. Pada PHP 5, kita bisa menangani error apa pun yang terjadi selama error tersebut tidak sampai level fatal. Sedangkan exception, ia adalah cara baru (di PHP 5) untuk menangani error, akan tetapi fatal error tetap tidak dianggap suatu exception.

Sedangkan setelah rilis PHP versi 7, semua fatal error akan melemparkan sebuah exception yang bisa kita tangkap menggunakan try-catch [2].

Perlu diperhatikan: beberapa level error seperti E_WARNINGE_NOTICE dan sebagainya tidak bisa kita catch karena keduanya bukan merupakan error yang serius.

Untuk membuat error-error “ringan” menjadi error yang dianggap serius, anda bisa menggunakan fungsi set_error_handler seperti yang telah kita pelajari dalam pertemuan sebelumnya.

Menangani Exception Dengan Try-Catch

Blok kode try .. catch akan memerintahkan interpreter PHP untuk mencoba mengeksekusi kode program pada blok try, dan jika terjadi suatu exception/error, fungsi catch akan dieksekusi.

Perhatikan contoh berikut:

<?php

try {
    echo "Halo bro! <br>";

    selamatPagi(); # fungsi tidak pernah didefinisikan
} catch (Exception $error) {
    echo "Error: {$error->getMessage()}";
}

Program di atas akan menghasilkan output:

Halo bro!
Error: Call to undefined function selamatPagi()

Membuat dan Melempar Exception Baru

Selain melakukan catching dari error bawaan PHP, kita juga bisa membuat exception kita sendiri dengan meng-override kelas Exception.

Perhatikan contoh fungsi rerataNilai() berikut. Kita akan mencoba untuk melempar objek Exception baru.

<?php

function rerataNilai (array $listNilai) {
  if (count($listNilai) < 1) {
    # jika array kosong, dia akan melempar objek Exception baru
    throw new Exception('Array tidak boleh kosong!');
  }

  # hitung rata-rata
  $total = 0;
  foreach ($listNilai as $nilai) {
    $total += $nilai;
  }

  return $total / count($listNilai);
}

Pada fungsi di atas, jika parameter $nilai adalah array kosong, maka exception baru akan dikembalikan. Sedangkan jika tidak, maka kode program selanjutnya akan dieksekusi.

Kita coba panggil fungsi rerataNilai dengan memberi parameter array kosong.

<?php
try {
  $arrayKosong = [];
  # panggil fungsi rerataNilai() dengan parameter array kosong
  $rataRata = rerataNilai($arrayKosong);
} catch (Exception $error) {
  echo "Error: {$error->getMessage()}";
}

Meng-extends Kelas Exception

Kita juga bisa membuat kelas Exception baru dengan meng-extends kelas bawaan PHP.

Misalkan kita ingin membuat Exception dengan nama ParameterFungsiSalahException. Kita bisa membuatnya seperti berikut:

<?php

class ParameterFungsiSalahException extends Exception {
  # kita buat kosongan sehingga kelas ini identik dengan parent-nya
}

Lalu kita bisa melempar exception yang telah kita buat seperti berikut:

<?php

function rerataNilai (array $listNilai) {
  if (count($listNilai) < 1) {
    # jika array kosong, dia akan melempar objek Exception baru
    throw new ParameterFungsiSalahException('Array tidak boleh kosong!');
  }

  # hitung rata-rata
  # ...
}

Multiple Exception

Di dalam PHP, kita bisa menangkap (meng-catch) lebih dari satu exception sekaligus. Hal ini biasa disebut multiple exception.

Untuk melakukannya, kita tinggal menulis blok kode catch {} berkali-kali.

Perhatikan contoh berikut:

<?php

$a = 5;
$b = 0;

try {
    if ($b < 1) {
        throw new DivisionByZeroError('Variabel $b tidak boleh 0');
    }

    echo $a / $b;
} catch (ArgumentCountError $error) {
  echo "ArgumentCountError exception: " . $error->getMessage();
} catch (DivisionByZeroError $error) {
  echo "DivisionByZeroError exception: " . $error->getMessage();
} catch (Exception $error) {
  echo "Exception: " . $error->getMessage();
}

Kode program di atas akan menghasilkan output:

DivisionByZeroError exception: Variabel $b tidak boleh 0

Blok Kode Finally

Selain blok kode try dan catch, kita juga bisa menambahkan blok kode finally. Ia adalah blok kode yang akan senantiasa dieksekusi oleh sistem: baik kode program di dalam blok kode try berhasil dijalankan mau pun terjadi error.

Perhatikan kode program di bawah:

<?php

try {
  # perintah ini tidak menimbulkan error
  echo "8 + 10 = " . (8 + 10) . "<br>";
} catch (Exception $error) {
  echo "Oops, sepertinya sistem kami sedang error <br>";
} finally {
  echo "Aku akan senantiasa dieksekusi <br>";
}

Output:

8 + 10 = 18
Aku akan senantiasa dieksekusi

Kelas Exception Bawaan PHP (Sampai Versi 7.4)

Seiring dengan perkembangannya, PHP sampai versi 7.4 telah datang dengan berbagai macam kelas Exception secara default. Berikut ini daftar exception tersebut:

Kesimpulan

Exception adalah cara baru untuk menangani error pada PHP. Ia menggunakan pendekatan OOP (Object Oriented Programming) berbeda dengan sebelumnya (versi < 5) yang mana pendekatan yang dilakukan masih prosedural.

Exception secara bahasa berarti pengecualian. Sedangkan secara istilah di dalam PHP, ia adalah sebuah perubahan alur program dari kondisi normal ke kondisi tertentu (atau pengecualian tertentu) jika terjadi suatu error (exception).

Di dalam PHP, kita bisa menggunakan blok kode try dan catch untuk menangani exception yang bersifat fatal. Sedangkan yang tidak fatal: kita bisa menggunakan fungsi set_error_handler() seperti yang telah kita pelajari pada pertemuan sebelumnya.

Pembahasan Selanjutnya

Pada pertemuan selanjutnya, insyaallah kita akan membahas cara mengelola (membaca dan menulis) file dengan bahasa pemrograman PHP.

Referensi

[1] https://www.php.net/manual/en/class.exception - diakses tanggal 4 Maret 2020
[2] https://dev.to/anastasionico/good-practices-handling-error-and-exceptions-in-php-5d8c - diakses tanggal 4 Maret 2020


12. Manipulasi File 1

PHP: Manipulasi File [1/2]

Pendahuluan

Di dalam tutorial ini kita akan membahas tentang cara manipulasi file di dalam PHP menggunakan fungsi-fungsi bawaan. Mulai dari berbagai cara untuk membaca file, menulis, menimpa file yang sudah ada dan juga menghapusnya.

Pembahasan ini akan kita bagi menjadi dua bagian: bagian pertama akan membahas cara membaca dan membuka file di dalam PHP. Sedangkan fungsi-fungsi sisanya akan kita bahas pada pertemuan ke-2.

Memeriksa Ketersediaan File

Sebelum kita memulai membaca file, kita akan mengenal fungsi file_exists() terlebih dahulu. Fungsi tersebut berfungsi untuk memeriksa apakah suatu file benar-benar exist atau tidak.

Jika file yang kita maksudkan ternyata memang ada, maka ia akan mengembalikan nilai true, dan sebaliknya jika file yang kita maksud ternyata tidak ada, dia akan mengembalikan nilai false.

Perhatikan contoh berikut:

<?php

if (file_exists('buah.txt')) {
  // file ada
} else {
  echo "File buah.txt tidak ditemukan <br>";
}

Jika file bernama buah.txt tidak ada, maka blok kode else yang akan dieksekusi oleh interpreter PHP.

Membaca File Dengan readfile()

Katakanlah kita memiliki sebuah file bernama buah.txt. File tersebut berisi nama-nama buah di tiap barisnya:

Mangga
Jeruk
Apel
Durian
Anggur

Lalu kita akan membacanya dengan PHP. Cara pertama yang bisa kita lakukan adalah menggunakan fungsi readfile(). Perhatikan contoh berikut:

<?php

echo readfile('buah.txt');

Fungsi readfile() akan membaca semua baris dari file buah.txt lalu diikuti ukuran file dalam satuan byte. Oleh karena itu kode program di atas akan menghasilkan output sebagai berikut:

Mangga Jeruk Apel Durian Anggur31

Fungsi readfile() bukan lah fungsi yang disarankan untuk membaca file karena keterbatasan fitur-fiturnya.

Membaca File Dengan file_get_contents()

Cara yang kedua adalah dengan menggunakan fungsi file_get_contents(). Fungsi tersebut bisa untuk membaca berbagai file, baik secara lokal mau pun global (maksudnya url suatu situs tertentu), dan juga bisa membaca berbagai format file baik itu gambar, teks, json, xml, dan lain-lain.

Kita akan coba membaca isi dari file buah.txt. Perhatikan contoh program berikut:

<?php

echo file_get_contents('buah.txt');

Output:

Mangga Jeruk Apel Durian Anggur

Jika anda mengubah karakter \n menjadi tag <br> menggunakan fungsi nl2br2() sebagaimana berikut:

<?php

echo nl2br(file_get_contents('buah.txt'));

Maka anda akan mendapatkan output yang sama persis dengan isi dari file buah.txt:

Mangga
Jeruk
Apel
Durian
Anggur

Membaca File Dengan file()

Di antara fungsi bawaan PHP yang bisa kita gunakan untuk membaca keseluruhan isi file adalah fungsi bernama file(). Ia melakukan tugas yang sama dengan fungsi file_get_contents().

Hanya saja, fungsi file() mengembalikan konten dari suatu file dalam bentuk array untuk tiap barisnya. Berbeda dengan fungsi file_get_contents() yang mengembalikan seluruh konten dari suatu file dalam bentuk string utuh.

Perhatikan contoh berikut:

<?php

$isiFileBuah = file('buah.txt');

echo '<pre>';
print_r($isiFileBuah);
echo '</pre>';

Output:

Array
(
    [0] => Mangga
    [1] => Jeruk
    [2] => Apel
    [3] => Durian
    [4] => Anggur
)

Kita juga bisa menampilkannya dengan foreach sebagaimana telah kita pelajari pada tutorial perulangan dan juga tutorial tentang manipulasi array.

Membaca File Dengan fopen()fread() dan fclose()

Cara selanjutnya adalah dengan menggunakan fopen()fread() dan fclose().

Cara ini lebih ribet dari sebelumnya, lebih banyak stepnya, tapi lebih direkomendasikan untuk kasus-kasus tertentu karena banyak fungsi yang bisa kita lakukan.

Skenario umumnya adalah 3 langkah:

  1. Kita buka file yang kita inginkan dengan fungsi fopen()
  2. Setelah file kita buka, kita bisa membaca isi file tersebut dengan fungsi fread().
  3. Ketika proses selesai, kita bisa menutup file tersebut dan menghapusnya dari memori menggunakan fungsi fclose().

Perhatikan contoh berikut, kita masih akan bermain-main dengan file buah.txt:

<?php

$file = fopen('buah.txt', 'r');

if (!$file) {
  die('File tidak ada');
}

# mulai baca file
echo fread($file, filesize('buah.txt'));

# tutup file agar ia dihapus dari memory
fclose($file);

Output:

Mangga Jeruk Apel Durian Anggur

Penjelasan

Dari kode program di atas, kita akan menjelaskan beberapa hal sebagai berikut:

  • fungsi fopen() menerima dua parameter:
    • parameter pertama adalah nama file
    • sedangkan parameter kedua adalah mode pembukaan file tersebut. Di dalam kode program di atas, kita menggunakan mode r yang artinya read.
    • Apa saja mode yang tersedia? Kita akan simak beberapa saat lagi.
  • fungsi fopen() akan bernilai false jika file yang kita maksud ternyata tidak ada.
  • fungsi fread() menerima 2 parameter:
    • parameter pertama yaitu hasil kembalian dari fungsi fopen()
    • dan parameter kedua berisi berapa byte yang akan dibaca dari file tersebut
    • paramter kedua kita isi dengan fungsi filesize('buah.txt') agar isi file tersebut terbaca semuanya.
  • setelah proses yang berkaitan dengan variabel $file selesai, kita tutup dengan fungsi fclose() yang menerima parameter hasil kembalian dari fungsi fopen().

Mode yang tersedia untuk fungsi fopen()

ModeDeskripsi
rMembuka file dalam mode read only.
wMembuka file dalam mode write only. Ia akan menghapus keseluruhan isi file dan menimpanya dengan yang baru, atau jika file tersebut belum pernah ada, ia akan membuatnya terlebih dahulu.
aMembuka file dalam mode write only. Isi dari file yang sebelumnya tetap dipertahankan.
xMembuat file baru dalam mode write only. Mengembalikan nilai false jika file telah ada sebelumnya.
r+Membuka file dalam mode read dan write.
w+Membuka file dalam mode read dan write. Menghapus konten file sebelumnya atau membuat file baru jika belum ada.
a+Membuka file dalam mode read dan write. Sama seperti w+ akan tetapi konten file yang sebelumnya tidak dihapus.
x+Membuka file dalam mode read dan write. Mengembalikan nilai false jika file telah ada sebelumnya.

Membaca File Perbaris dengan fgets()

Selain menggunakan fungsi fread() untuk membaca konten dari suatu file. Kita juga bisa menggunakan fungsi fgets().

Bedanya?

Jika menggunakan fread() berarti kita akan membaca konten dari suatu file sesuai dengan ukuran byte yang kita definisikan. Sedangkan jika menggunakan fungsi fgets(), maka kita membaca konten perbaris.

Perhatikan contoh berikut:

<?php

$file = fopen('buah.txt', 'r');

if (!$file) {
  die('File tidak ada');
}

# mulai baca file
echo fgets($file) . '<br>'; # baris 1
echo fgets($file) . '<br>'; # baris 2
echo fgets($file) . '<br>'; # baris 3
echo fgets($file) . '<br>'; # baris 4
echo fgets($file) . '<br>'; # baris 5

# tutup file agar ia dihapus dari memory
fclose($file);

Kode program di atas akan menghasilkan output sebagai berikut:

Mangga
Jeruk
Apel
Durian
Anggur

Mengetahui Akhir Baris Suatu File

Dari kode program sebelum ini, kita tahu bahwa pointer dari proses pembacaan file akan berpindah dengan memanggil fungsi fgets(). Sehingga kita bisa menampilkan semua baris dari suatu file dengan memanggil fgets() sebanyak jumlah baris tersebut.

Akan tetapi, bagaimana caranya kita tahu bahwa pointer pembacaan file telah berada pada baris paling bawah?

Jawabannya adalah menggunakan fungsi feof(). Kata eof sendiri adalah singkatan dari end-of-file. Fungsi tersebut akan mengembalikan nilai true jika pointer berada pada baris paling akhir, dan jika tidak maka ia akan mengembalikan nilai false.

Perhatikan kode program berikut:

<?php

$file = fopen('buah.txt', 'r');

if (!$file) {
  die('File tidak ada');
}

# lakukan perulangan selama feof bernilai false
while (!feof($file)) {
    echo fgets($file) . '<br>';
}

# tutup file agar ia dihapus dari memory
fclose($file);

Kesimpulan

Bahasa pemrograman PHP adalah bahasa yang berjalan di server. Sehingga proses manipulasi file adalah suatu hal yang hampir menjadi keniscayaan.

Untuk membaca file, kita bisa menggunakan beberapa cara. Mulai dari fungsi readfile(), fungsi file_get_contents(), fungsi file(), fungsi fread() dan juga fgets().

Pembahasan Selanjutnya

Pada pembahasan selanjutnya, insyaallah kita masih dalam pembahasan manipulasi file bagian kedua. Yaitu tentang membuat file baru, mengedit, dan juga menghapus.


13. Manipulasi File 2

PHP: Manipulasi File [2/2]

Pendahuluan

Pada pertemuan sebelumnya, kita telah mempelajari beberapa cara untuk membuka dan membaca file dengan PHP. Mulai dari menggunakan fungsi readfile(), fungsi file_get_contents() hingga menggunakan skema fopen() dan variasinya.

Pada pertemuan kali ini, kita akan melanjutkan pembahasan tentang manipulasi file.

Membuat File Baru Dengan fopen()

Seperti yang sudah kita singgung sebelumnya, bahwa fungsi fopen() menerima dua buah paramter:

  • parameter pertama adalah nama file
  • parameter kedua adalah mode pembukaan file

Untuk membuat file baru, kita bisa menggunakan mode waw+ atau a+. Silakan kembali lagi ke pertemuan sebelumnya untuk melihat jenis-jenis mode fopen() yang bisa kita gunakan.

Sebagai contoh, untuk membuat file baru. Kita bisa menggunakan perintah berikut:

<?php

$namaFile = 'nama-bulan.txt';
$file = fopen($namaFile, 'w');

Kode program di atas akan membuat file baru bernama nama-bulan.txt.

Permission File

Kode program di atas tidak mengeluarkan output apa pun.

Akan tetapi jika anda mendapatkan pesan error, maka pastikan bahwa PHP anda memiliki hak akses untuk menulis file pada lokasi yang terkait.

Kita telah berhasil membuat file baru dengan nama nama-bulan.txt. Tapi jika file tersebut kita buka, kita tidak akan mendapati apa pun di sana.

Kita bisa menambahkan konten pada suatu file dengan perintah fwrite().

Ada pun behavior bagaimana cara menulis kontennya: apakah ia menimpa konten yang sudah ada, atau ia tetap mempertahankan konten file sebelumnya, maka itu tergantung mode yang kita pilih saat memanggil fungsi fopen().

Setelah ini, kita akan mencoba dan mempraktikkan beberapa mode fopen().

Menghapus Konten dan Menimpanya Dengan Yang Baru

Mode yang pertama adalah mode w. Alias mode write only. Mode tersebut memiliki 2 tugas utama:

  • membuat file baru jika file-nya tidak ada (sudah kita praktikkan di atas)
  • meletakkan pointer ke baris pertama konten, sehingga ketika kita lakukan proses penulisan dengan fungsi fwrite(), isi konten yang lama akan ditimpa dengan yang baru.

Kita telah membuat file nama-bulan.txt. Kita akan coba untuk menulis sesuatu di dalam file tersebut. Perhatikan kode program berikut:

<?php

$namaFile = 'nama-bulan.txt';
$file = fopen($namaFile, 'w');

$konten = "Januari\nFebruari\nMaret\nApril\nMei";

fwrite($file, $konten);

fclose($file);

Ketika kita jalankan program di atas lalu kita buka file nama-bulan.txt. Kita akan mendapati konten file tersebut adalah sebagai berikut:

Januari
Februari
Maret
April
Mei

Anda bisa:

  • mengganti isi dari variabel $konten
  • lalu mengeksekusi ulang skrip tersebut
  • kemudian lihat apa yang terjadi dengan isi dari file nama-bulan.txt

Mengedit Dengan Mempertahankan Konten Sebelumnya

Setelah melakukan percobaan di atas, kita tahu bahwa file nama-bulan.txt akan senantiasa ditimpa dengan konten baru karena kita menggunakan mode w ketika memanggil fungsi fopen().

Berbeda jika kita menggunakan mode a, maka behavior yang akan kita dapatkan adalah:

  • sistem akan berusaha membuka file yang dimaksud. Jika tidak ada, ia akan membuatnya.
  • sistem akan meletakkan pointer pada bagian paling akhir dari file tanpa menghapus konten yang sebelumnya sudah ada.

Silakan ganti kode program di atas dengan kode program yang baru:

<?php

$namaFile = 'nama-bulan.txt';
$file = fopen($namaFile, 'a');

$konten = "Juni\nJuli\nAgustus\nSeptember\nOktober";

fwrite($file, $konten);

fclose($file);

Ketika saya jalankan kode program di atas sebanyak satu kali, saya mendapatkan output sebagai berikut:

Januari
Februari
Maret
April
MeiJuni
Juli
Agustus
September
Oktober

Perhatikan baris ke 5 dari output di atas, kata “Mei” dan “Juni” bergabung jadi satu. Itu karena output dari file sebelumnya tidak diakhiri dengan kode \n alias karakter ganti baris.

Untuk mode lainnya dari fopen() anda bisa melihatnya lagi pada tutorial manipulasi file php bagian 1. Anda bisa mengeksplorasinya secara mandiri.

Mengkopi File

Di antara hal yang lazim dilakukan dalam rangka memanipulasi file dalam PHP adalah: mengkopi file.

Untuk mengkopi atau menggandakan file, kita bisa memanggil fungsi bawaan PHP bernama copy().

Fungsi tersebut menerima 2 parameter:

  1. Parameter untuk nama file yang akan dikopi
  2. Lokasi/Nama file baru hasil kopian

Perhatikan contoh berikut, kita akan menggandakan file nama-bulan.txt yang telah kita buat:

<?php

copy('nama-bulan.txt', 'nama-bulan-indo.txt');

Kita akan mendapatkan file baru yaitu nama-bulan-indo.txt.

├── 13-manipulasi-file-part-2
    ├── index.php
    ├── nama-bulan-indo.txt
    └── nama-bulan.txt

Memindahkan dan Merename File

Untuk memindahkan file, anda bisa menggunakan fungsi rename(). Cara kerjanya sama saja dengan fungsi copy().

Ia menerima 2 paramter:

  1. parameter untuk nama/path file yang lama
  2. parameter untuk nama/path file yang baru

Fungsi rename() akan memindahkan suatu file dari lokasi lama ke lokasi baru. Jika lokasi baru ternyata masih dalam satu direktori dan nama filenya berbeda, maka fungsi tersebut secara tidak langsung akan merename file yang dimaksud.

Kita akan coba memindahkan file nama-bulan.txt ke lokasi yang sama, tapi dengan nama baru yaitu nama-bulan-old.txt. Perhatikan kode program berikut:

<?php

rename('nama-bulan.txt', 'nama-bulan-old.txt');

Jika kita eksekusi, maka file nama-bulan.txt seolah-olah ter-rename dengan menggunakan fungsi rename().

├── 13-manipulasi-file-part-2
    ├── index.php
    ├── nama-bulan-indo.txt
    └── nama-bulan-old.txt

Menghapus File

Untuk menghapus file, kita bisa menggunakan fungsi unlink().

Perhatikan kode program berikut:

<?php

unlink('nama-bulan-old.txt');

Kode program di atas akan menghapus file nama-bulan-old.txt.

Beberapa Fungsi Lainnya

Selain fungsi-fungsi yang telah kita pelajari di dua pertemuan ini, masih ada fungsi-fungsi lain yang bisa anda coba:

  • mkdir(): berfungsi untuk membuat sebuah direktori
  • rmdir(): menghapus suatu folder. Tapi foldernya harus kosong.
  • is_dir(): berfungsi untuk memeriksa apakah suatu path adalah direktori atau bukan
  • is_file(): berfungsi untuk memeriksa apakah suatu path adalah file atau bukan
  • scandir(): mengembalikan konten dari sebuah direktori dalam bentuk array (konten bisa berupa file dan juga sub-direktori)
  • getcwd(): mengembalikan lokasi direktori yang sedang aktif

Kesimpulan

Bahasa pemrograman PHP adalah bahasa yang berjalan di server. Sehingga proses manipulasi file adalah suatu hal yang hampir menjadi keniscayaan.

Oleh karena itu, tidak heran bahwasanya PHP datang dengan berbagai macam fungsi bawaan yang memungkinkan kita bisa memanipulasi file mau pun direktori dengan mudah.

Pembahasan Selanjutnya

Pada pertemuan selanjutnya, insyaallah kita akan mengambil pembahasan terakhir untuk seri tutorial PHP tingkat menengah ini: yaitu pembahasan tentang regular expression.

Jangan lupa untuk share tutorial ini, ya! Terima kasih banyak.


14. Regular Expression

PHP: Belajar Regular Expression

Apa Itu Regular Expression?

Regular Expression atau biasa disingkat regex, adalah suatu metode untuk mengenali atau mendeteksi suatu pola tertentu pada suatu string.

Dengan menggunakan regex, kita bisa mendeteksi pola string seperti email, hashtag, link dan pola-pola kompleks lainnya dengan hanya satu ekpresi saja.

Ia juga merupakan metode standar dan independen, tidak mengenal bahasa pemrograman. Kita bisa mengimplementasi regex di berbagai macam bahasa pemrograman: termasuk PHP.

Kapan Harus Menggunakan Regular Expression?

Jika anda hanya butuh mendeteksi suatu kata statis dalam suatu string, jangan gunakan regex!

Tapi jika anda butuh untuk mendeteksi suatu pola yang dinamis dalam suatu string, maka anda tidak punya pilihan yang lebih baik dari pada regex.

Misalkan anda memiliki teks seperti ini:

*Kabarkan* kepada semua mahasiswa bahwa besok *kelas pemrograman web diliburkan*

Lalu anda ingin mencetak tebal semua karakter yang diapit dengan tanda bintang (**), sehingga teks di atas berubah menjadi seperti ini:

Kabarkan kepada semua mahasiswa bahwa besok kelas pemrograman web diliburkan

Maka cara terbaik untuk melakukan hal tersebut adalah: memanfaatkan regex.

Beberapa Fungsi Regular Expression Pada PHP

Di dalam PHP, terdapat beberapa fungsi yang berkaitan dengan penggunaan regex. Di antaranya:

FungsiDeskripsi
preg_match()Mencari kata/karakter yang sesuai dengan pola regex.
preg_match_all()Mencari semua kata/karakter yang sesuai dengan pola regex.
preg_replace()Mencari kata/karakter yang sesuai dengan pola regex, lalu menimpanya dengan data baru.
preg_grep()Mengembalikan kata/karakter yang sesuai dengan pola regex.
preg_split()Membagi string menjadi sebuah array menggunakan pola regex.

Table 1: fungsi-fungsi bawaan PHP untuk bekerja dengan regex

Beberapa Meta Karakter Regex

Terdapat banyak sekali meta karakter atau pola dalam regex. Akan tetapi, di bawah ini adalah yang mungkin paling sering anda gunakan.

KarakterDeskripsi
\skarakter putih (spasi, tab, baris baru)
\dangka digit (0-9)
\wkarkater huruf (a-z, A-Z, 0-9, _)
[aeiou]pola yang terdiri dari set karakter di dalam kurung siku
[^aeiou]pola yang tidak terdiri dari set karakter di dalam kurung siku
`(foobar

Table 2: beberapa meta karakter regex yang sering digunakan

Agar lebih mudah memahami regex, kita akan coba langsung mempraktikkannya. Kasus yang akan kita buat adalah:

  1. Deteksi #hashtag
  2. Deteksi @username
  3. Deteksi Email
  4. Dan Deteksi Kode Spesial Whatsapp

Langsung saja buka teks editor kalian, lalu buat 4 buah file sebagai berikut:

src/
├── fungsi
│   ├── deteksi-email.php
│   ├── deteksi-hashtag.php
│   ├── deteksi-kode-spesial-whatsapp.php
│   └── deteksi-username.php
└── index.php

Pada file index.php, require semua file yang berada pada direktori fungsi/.

<?php

require_once 'fungsi/deteksi-email.php';
require_once 'fungsi/deteksi-hashtag.php';
require_once 'fungsi/deteksi-kode-spesial-whatsapp.php';
require_once 'fungsi/deteksi-username.php';

Oke, setelah itu kita akan mulai dari setiap kasus.

1. Deteksi #hashtag

Kasus yang pertama adalah mendeteksi setiap kata yang diawali tanda pagar alias hashtag. Setelah berhasil mendeteksi, kita akan mereplace setiap hashtag menjadi link ke twitter.com.

Untuk mendeteksi pola hashtag, kita akan gunakan fungsi preg_match_all() yang akan mengembalikan semua teks yang sesuai dengan pola.

Buka file index.php. Lalu tambahkan kode berikut:

<?php

$teks1 = "Dihimbau agar seluruh masyarakat waspada akan #virus #corona 
yang akhir-akhir ini mulai menyebar.";

echo deteksiHashtag($teks1);

Pada file fungsi/detekksi-hashtag.php, buat fungsi deteksiHashtag(). Lalu kita coba untuk mendeteksi semua tanda # yang ada (sementara tanda pagarnya saja dulu)

<?php

function deteksiHashtag($input)
{
    $regex = "/#/";
    $hasil = [];
    
    preg_match_all($regex, $input, $hasil);

    # kembalikan data dalam bentuk json
    return json_encode($hasil);
}

Jika skrip index.php dijalankan, ia akan menghasilkan output sebagai berikut:

[["#","#"]]

Penjelasan:

  • Pola yang kita definisikan adalah /#
  • Pola tersebut hanya akan mencari tanda # yang ada pada variabel $input
  • Hasil kembaliannya, kita mendapatkan ada dua tanda pagar yang dikembalikan

Oke, sekarang kita akan kembangkan polanya menjadi sedikit lebih rumit. Kita akan memanfaatkan tanda kurung siku untuk menentukan set karakter pola untuk mendeteksi hashtag. Silakan lihat kembali ke tabel 2 untuk melihat deskripsi meta karakter yang ada.

Pada file fungsi/deteksi-hashtag.php, ubah variabel $regex menjadi seperti ini:

<?php

$regex = "/#[a-z]/";

Lalu jalankan lagi file index.php, kita akan mendapatkan output seperti berikut:

[["#v","#k"]]

Penjelasan:

  • di dalam variabel $regex, kita mendefinisikan pola yang berisi 2 karakter.
  • karakter pertama adalah tanda pagar
  • dan karakter kedua adalah set huruf dari a sampai z
  • sehingga hasil yang kita dapatkan adalah #v dan #k.

Pertanyaan: lalu bagaimana untuk mendeteksi semua karakter dalam satu kata yang ada?

Jawabannya adalah: dengan menambahkan tanda + setelah kurung siku!

Ubah variabel $regex menjadi seperti ini:

<?php

$regex = "/#[a-z]+/";

Lalu jalankan lagi aplikasi, dan sekarang kita berhasil mendapatkan output yang kita inginkan:

[["#virus","#corona"]]

Agar kita bisa mendeteksi hashtag yang juga berisi angka, huruf kapital serta underscore. Kita harus mengubah variabel $regex seperti berikut:

<?php

$regex = "/#[a-zA-Z0-9_]+/";

Oiya, satu lagi. Kita ingin hanya mendapatkan kata virus saja bukan #virus, begitu juga kata korona saja bukan #korona. Maka kita bisa memberikan tanda kurung untuk memisahkan satu elemen tertentu dari suatu pola regex.

Ubah variabel $regex menjadi seperti berikut:

<?php

$regex = "/#([a-zA-Z0-9_]+)/";

Jika kita eksekusi, kita akan mendapatkan output seperti berikut:

[["#virus","#corona"],["virus","corona"]]

Anda bisa perhatikan dari output di atas bahwa kita memiliki array dengan 2 item, di mana item pertama berisi pola secara lengkap. Dan item ke-2 berisi pola yang diapit oleh tanda kurung saja (tanpa tanda pagar).

Langkah selanjutnya, kita akan menggunakan fungsi preg_replace() untuk menimpa semua hashtag dengan sebuah link yang mengarah ke twitter.

Ubah fungsi deteksiHashtag() menjadi seperti berikut:

<?php

function deteksiHashtag($input)
{
    $regex = "/#([a-zA-Z0-9_]+)/";
    $timpa = "<a href='https://twitter.com/hashtag/$1'>$0</a>;";

    return preg_replace($regex, $timpa, $input);
}

Perhatikan baris yang saya highlight di atas:

  • $1 menandakan pola yang diapit oleh tanda kurung
  • sedangkan $0 menandakan pola secara keseluruhan
  • jika ada tanda kurung yang lain, maka anda bisa menggunakan variabel $2 untuk menampilkannya

Jika program saya eksekusi kembali, saya mendapatkan output seperti berikut:

Dihimbau agar seluruh masyarakat waspada akan #virus #corona yang akhir-akhir ini mulai menyebar.

2. Deteksi @username

Setelah mencoba langkah-langkah yang cukup detil pada contoh kasus pertama, saya rasa untuk kasus kedua tidak terlalu susah. Karena kita hanya perlu mengganti tanda # di atas menjadi tanda @. Lalu mengganti url twitter menjadi "https://twitter.com/$1".

Langsung saja.

Buka file fungsi/deteksi-username.php. Lalu tambahkan fungsi bernama deteksiUsername() sebagaimana berikut:

<?php

function deteksiUsername($input)
{
    $regex = "/@([a-zA-Z0-9_]+)/";
    $timpa = "<a href='https://twitter.com/$1'>$0</a>;";

    return preg_replace($regex, $timpa, $input);
}

Lalu pada file index.php, kita bisa menambahkan teks baru seperti berikut:

<?php

$teks2 = "Pak @jokowi telah menyampaikan #pidato yang berisi 
#himbauan kepada masyarakat untuk tidak banyak 
beraktifitas di luar rumah demi mencegah 
tersebarnya #virus #korona.";

echo deteksiUsername(
  deteksiHashtag($teks2)
);

Ketika saya eksekusi, ini adalah output yang saya dapatkan:

Pak @jokowi telah menyampaikan #pidato yang berisi #himbauan kepada masyarakat untuk tidak banyak beraktifitas di luar rumah demi mencegah tersebarnya #virus #korona.

3. Deteksi Email

Untuk mendeteksi email, kita bisa melakukannya dengan 3 pola bagian:

  • pola pertama adalah username email (sebelum tanda @). Pola ini adalah semua karakter dalam set [a-zA-Z0-9_] atau kita bisa singkat dengan menggunakan meta karakter \w.
  • pola yang kedua adalah tanda @.
  • pola yang ketiga adalah domain. Domain terdiri dari dari karakter huruf kecil dan titik ([a-z.]+)

Sehingga ketika 3 pola di atas kita rangkai, kita mendapatkan pola sebagai berikut:

<?php

$regex = "/[\w]+@[a-z.]+/";

Langsung saja. Silakan buka file fungsi/deteksi-email.php lalu buat fungsi deteksiEmail sebagai berikut:

<?php

function deteksiEmail($input)
{
    $regex = "/[\w]+@[a-z.]+/";
    $timpa = "<a href='mailto:$0'>$0</a>";

    return preg_replace($regex, $timpa, $input);
}

Lalu pada file index.php, kita bisa tambahkan teks baru sebagai berikut:

<?php
$tesk3 = "Untuk informasi lebih lanjut tentang pendidikan di Surabaya, 
anda bisa mengirimkan surel ke alamat dispendik@surabaya.go.id";

echo deteksiEmail($tesk3);

Maka setelah dijalankan, output yang kita dapatkan adalah sebagai berikut:

Untuk informasi lebih lanjut tentang pendidikan di Surabaya, anda bisa mengirimkan surel ke alamat dispendik@surabaya.go.id

4. Deteksi Kode Spesial Whatsapp

Kita telah mencoba 3 contoh kasus. Ketiga contoh tersebut terbilang sederhana karena ketiganya hanya menerapkan satu pola dan satu timpaan.

Sedangkan pada kasus ini, kita akan mencoba 3 pola sekaligus dalam satu kali pemanggilan fungsi preg_replace.

Selain menerima parameter string, fungsi preg_replace juga bisa menerima parameter berupa array yang berisi kumpulan lebih dari satu pola.

3 pola yang akan kita buat adalah sebagai berikut:

  • Double underscore (__): untuk mencetak miring.
  • Double bintang (**): untuk mencetak teks tebal.
  • Double gelombang (~~): untuk mencetak teks tercoret.

Langsung saja.

Buka file fungsi/deteksi-kode-spesial-whatsapp.php dan buat fungsi dengan nama deteksiKodeSpesialWA() lalu tuliskan kode program seperti berikut:

<?php

function deteksiKodeSpesialWA($input)
{
    $regex = [
        "/_([\w\s]+)_/",
        "/\*([\w\s]+)\*/",
        "/\~([\w\s]+)\~/"
    ];

    $timpa = [
        "<i>$1</i>",
        "<strong>$1</strong>",
        "<strike>$1</strike>"
    ];

    return preg_replace($regex, $timpa, $input);
}

Penjelasan:

  • variabel $regex dan $timpa berupa array yang berisi 3 buah item.
  • pola pertama dari array $regex akan ditimpa oleh string pertama dari array $timpa, dan begitu seterusnya.
  • meta karakter \w pada setiap pola di atas berarti [a-zA-Z0-9_].
  • dan meta karakter \s berarti karakter putih: yaitu spasi, tab, dan ganti baris.
  • kita menggunakan karakter putih karena bisa jadi yang diapit oleh tanda underscore/bintang/gelombang adalah kumpulan beberapa kata yang dipisahkan dengan spasi.

Setelah beres dengan fungsi deteksiKodeSpesialWA(). Sekarang kita ubah file index.php, tambahkan kode program berikut:

<?php

$teks4 = "_Bismillahirrahmanirrahim_.. Mohon maaf, sepertinya besok 
saya *tidak bisa hadir* ke kampus karena ~malas~ ada suatu 
kepentingan.";

echo deteksiKodeSpesialWA($teks4);

Bismillahirrahmanirrahim.. Mohon maaf, sepertinya besok saya tidak bisa hadir ke kampus karena malas ada suatu kepentingan.

Kode Sumber Lengkap

Kode sumber lengkap untuk tutorial ini dan seri tutorial PHP tingkat menengah lainnya bisa anda dapatkan di repositori github di sini.

Kesimpulan

Regex adalah suatu metode/pendekatan untuk mendeteksi suatu pola dari suatu string. Dengan memanfaatkan regex, kita bisa memeriksa berbagai macam pola teks yang rumit hanya dalam satu ekspresi saja.

Di dalama tutorial ini, kita telah mencoba 4 contoh kasus untuk memahami lebih jauh bagaimana cara bekerja dengan regex pada PHP.