Sepanjang section ini setiap percobaan kita mengikuti ritme yang sama: membuat berkas, menyimpan, menjalankan lewat terminal, lalu mengulang semuanya hanya untuk mengubah satu baris. Untuk pertanyaan kecil — berapa hasil ekspresi ini? apa isi variable itu sekarang? — ritme tersebut terasa berat. PHP CLI menyediakan interactive shell: mode percakapan tempat Anda mengetik kode dan langsung melihat hasilnya baris demi baris. Pada Chapter ini kita memasuki mode tersebut, mengamati bagaimana variable bertahan antar perintah, lalu menyiapkan alternatif yang selalu tersedia berupa kode sekali pakai lewat php -r.
Apa itu Interactive Shell #
Interactive shell adalah pola antarmuka yang dikenal luas dengan nama REPL — Read, Eval, Print, Loop. Shell membaca satu perintah yang Anda ketik (read), mengevaluasinya sebagai kode PHP (eval), mencetak hasilnya ke layar (print), lalu kembali menunggu perintah berikutnya (loop). Seluruh percakapan berlangsung di dalam satu proses PHP yang sama, sehingga segala yang berlaku pada berkas script biasa — variable, konstanta, operator — berlaku juga di dalam shell. Umpan balik yang seketika membuatnya menjadi tempat paling nyaman untuk bereksperimen: mencoba ekspresi atau memeriksa isi variable bisa dilakukan tanpa menyentuh editor sama sekali.
Memasuki dan Meninggalkan Shell #
Mode ini diaktifkan dengan opsi -a (interactive):
php -aPada instalasi PHP yang menyertakan ekstensi readline — misalnya paket php-cli di Ubuntu atau rilis resmi dari php.net — perintah tersebut membuka sesi seperti berikut:
$ php -a
Interactive shell
php > echo "halo";
halo
php > exit;Mari kita bedah sesi di atas bagian demi bagian:
$ php -a: tanda$adalah prompt shell sistem operasi; perintah ini memindahkan layar ke mode percakapan, diawali judulInteractive shelldan satu baris kosong sebagai pemisah.php > echo "halo";: promptphp >menandakan PHP sedang menunggu kode; statement diakhiri titik koma, lalu Enter ditekan.halo: hasil eksekusi tampil pada baris berikutnya, lalu promptphp >muncul kembali.exit;: statement ini mengakhiri sesi — PHP keluar, dan prompt shell sistem operasi kembali.
Statement mengikuti aturan yang sama dengan berkas dengan satu penyesuaian: tidak perlu tag <?php karena seluruh sesi sudah berada di mode PHP, sedangkan titik koma penutup statement tetap wajib.
Variable Bertahan Antar Perintah #
Karena seluruh perintah dieksekusi di dalam satu proses yang sama, variable yang dibuat pada satu perintah tetap hidup untuk perintah-perintah berikutnya:
php > $nama = "Budi";
php > $total = 50000 * 3;
php > echo "Halo, $nama!";
Halo, Budi!
php > echo "Total: Rp$total";
Total: Rp150000Dua perintah pertama tidak mencetak apa pun — penugasan memang tidak menghasilkan output, sama seperti pada berkas. Saat perintah ketiga dieksekusi, nilai $nama dari perintah pertama masih tersimpan sehingga tercetak Halo, Budi!; begitu pula $total yang berisi hasil perkalian 150000. Perilaku ini setara dengan berkas berikut:
<?php
$nama = "Budi";
$total = 50000 * 3;
echo "Halo, $nama!\n";
echo "Total: Rp$total\n";Output yang Dihasilkan:
Halo, Budi!
Total: Rp150000Ada satu perbedaan kecil yang perlu dicermati: pada sesi shell, hasil setiap statement otomatis tampil pada baris baru, sedangkan echo pada berkas mencetak apa adanya tanpa menambah baris baru — karena itulah contoh berkas di atas memakai \n secara eksplisit. Di luar hal itu, aturan mainnya sama persis.
Perintah yang Membentang Beberapa Baris #
Statement boleh membentang beberapa baris — misalnya saat mendefinisikan function (blok kode bernama yang dapat dipanggil ulang; materi lengkapnya ada di Section Fungsi). Shell tidak buru-buru mengeksekusi, melainkan menunggu hingga statement lengkap, dan menandai kondisi itu dengan prompt lanjutan php {:
php > function sapa($nama)
php > {
php { return "Halo, $nama!";
php { }
php > echo sapa("Budi");
Halo, Budi!Begitu baris berisi tanda { pembuka blok dikonfirmasi, prompt berubah dari php > menjadi php { — tanda shell tahu bahwa kode masih berlanjut dan belum siap dievaluasi. Setelah } penutup diketik, statement dievaluasi, function sapa() siap dipakai, dan prompt kembali normal; panggilan echo sapa("Budi"); kemudian mencetak nilai balikannya persis seperti pada berkas. Sifat sabar menunggu ini membuat Enter yang ditekan terlalu dini tidak mengacaukan apa pun.
Peran Ekstensi readline #
Kenyamanan pada sesi di atas — pengeditan baris, riwayat perintah lewat tombol panah atas dan bawah, pelengkapan otomatis — disediakan oleh ekstensi readline. Riwayat perintah bahkan tersimpan otomatis ke berkas ~/.php_history, sehingga perintah dari sesi kemarin masih bisa dipanggil kembali; tombol TAB melengkapi nama function, variable, konstanta, dan class, dan menekannya dua kali menampilkan seluruh kandidat yang mungkin.
Konsekuensinya, interactive shell hanya aktif bila readline tersedia. Sebagian besar instalasi resmi menyertakannya, tetapi tidak semua build PHP memuatnya — periksa lewat daftar ekstensi:
php -m | grep readlineBila baris readline muncul, shell siap dipakai. Bila perintah di atas tidak mencetak apa pun, php -a menolak masuk mode interaktif:
php -aInteractive shell (-a) requires the readline extension.Itulah hasil nyata saat kami mencobanya di PHP 8.4.23 versi statis yang dipakai untuk menyiapkan materi ini — build tersebut tidak memuat readline, sehingga PHP mencetak pesan penolakan di atas lalu berakhir dengan exit code 1. Sesi interaktif memang tidak bisa diuji otomatis, sehingga transkrip pada Chapter ini kami susun mengikuti dokumentasi resmi PHP; sebagai gantinya, contoh php -r di bawah benar-benar dieksekusi dan diverifikasi di lingkungan penulisan.
Alternatif php -r yang Selalu Ada #
Untuk eksperimen cepat, opsi -r (run) mengeksekusi kode langsung dari argument command line tanpa berkas dan tanpa tag <?php. Chapter Menjalankan Script melalui CLI
sudah membahas dasarnya termasuk alasan membungkus kode dengan kutip tunggal; di sini kita manfaatkannya sebagai pengganti shell:
php -r 'echo "halo", PHP_EOL;'
php -r '$nama = "Budi"; echo "Halo, $nama!", PHP_EOL;'Output yang Dihasilkan:
halo
Halo, Budi!Ekspresi dan function bawaan juga bisa diuji dalam satu baris, misalnya memeriksa hasil perpangkatan dengan var_dump():
php -r 'var_dump(2 ** 10);'Output yang Dihasilkan:
int(1024)Namun ada perbedaan penting dibandingkan interactive shell: setiap panggilan php -r adalah proses PHP yang benar-benar baru, sehingga variable dari satu panggilan tidak akan ada pada panggilan berikutnya:
php -r '$nama = "Budi";'
php -r 'echo "Halo, $nama!";'Output yang Dihasilkan:
Warning: Undefined variable $nama in Command line code on line 1
Halo, !Panggilan pertama hanya menyimpan nilai lalu selesai; ketika panggilan kedua berjalan, $nama sudah tidak ada, sehingga PHP melaporkan Warning dan echo mencetak string kosong di posisi variable — hasilnya Halo, !. Baris kosong sebelum Warning adalah pemisah yang otomatis disisipkan PHP agar pesan error tidak menempel pada output lain. Kegagalan kecil seperti ini justru bahan belajar berikutnya: pesan Warning itu punya format dan aturan yang bisa dibaca.
Ringkasan #
Interactive shell (php -a) menghadirkan PHP sebagai percakapan: statement diketik, dievaluasi seketika, hasilnya tampil, dan variable tetap hidup antar perintah karena semuanya berjalan dalam satu proses. Kenyamanannya bertumpu pada ekstensi readline; bila ekstensi itu absen, php -r menjadi alternatif yang selalu tersedia dengan catatan setiap panggilan memulai proses baru tanpa memori panggilan sebelumnya. Dengan tiga jalur eksekusi — berkas, web server, dan mode interaktif — kita kini lengkap memegang cara menjalankan PHP. Tinggal satu bekal terakhir sebelum menulis program sungguhan: membaca pesan error yang pasti akan muncul di sepanjang perjalanan.