PHP Dasar
Target: Pemula yang baru mulai belajar pemrograman web dengan PHP modern (PHP 8.x). Versi: PHP 8.x (Modern PHP) Fokus modul pembelajaran ini: mental model server-side → CLI server → sintaks & tag dasar → variable & data types → operator & control flow → loop → string & array functions → function & type declarations → variable scope → closures & callbacks → file inclusion (
require/include) → references → mini project interaktif.
Cara Belajar
🟢 Fundamental
→ wajib dipahami sebelum masuk ke framework atau topik lanjutan
🟡 Lanjutan
→ pelajari setelah memahami control flow, array, dan function dasar
🔴 Advanced / Reference
→ penting untuk pemahaman mendalam, optimasi, dan referensi syntaxMental model eksekusi PHP pada Web Server:
Browser HTTP Request (Client)
│
│ GET /index.php
▼
Web Server (Nginx / Apache / PHP CLI Server)
│
│ meneruskan request ke PHP Engine
▼
PHP Interpreter Engine (Zend Engine)
│
│ 1. Parsing & Kompilasi Opcode
│ 2. Eksekusi Logic & Query Database
│ 3. Generate Output Teks (HTML / JSON)
▼
HTTP Response (HTML / Plain Text)
│
│ dikirim kembali melalui network
▼
Browser me-render tampilan untuk UserHafalan:
PHP → Server-side scripting: kode diproses di server, user hanya menerima hasil akhir
Tag PHP → <?php ... ?> menandai area eksekusi kode PHP
Statement → Setiap baris perintah PHP wajib diakhiri titik koma (;)
Variable → Diawali tanda dollar ($name) dan bersifat case-sensitive
Output Teks → echo atau print untuk mengirimkan teks ke response bufferDaftar Isi
🟢 Fundamental
- Pengenalan PHP & Mental Model Server-Side
- Menginstall & Menjalankan PHP CLI Server
- Program Hello World & Tag PHP
- Komentar & Dokumentasi Kode
- Variable & Naming Rules
- Constant (const & define)
- Data Types (Scalar & Compound)
- String Dasar, Heredoc & Nowdoc
- Array Dasar (Indexed & Associative)
- Debugging dengan var_dump() & print_r()
- Expression, Statement, dan Block
- Operator Aritmatika
- Operator Penugasan (Assignment)
- Operator Perbandingan (Strict vs Loose)
- Operator Logika
- Increment dan Decrement
- If, Elseif, Else Statement
- Ternary & Short Ternary Operator
- Null Coalescing Operator (?? & ??=)
- Switch Statement
- Match Expression (PHP 8+)
- For Loop
- While Loop
- Do While Loop
- Foreach Loop & Destructuring
- Break dan Continue
- Manipulasi String
- Array Functions Esensial
- String Functions Esensial
- Type Checking (is_*) & Type Casting
- Function Dasar & Deklarasi
- Parameter, Default Value & Named Arguments
- Return Value & Early Return
- Type Declaration (Scalar, Return, & Union)
- Variable Scope (Local, Global, Static)
🟡 Lanjutan
- Anonymous Function (Closure) & use Keyword
- Arrow Function (fn() ⇒)
- Callback Function & callable
- Variable Function
- Recursive Function
- File Inclusion (require, include, require_once)
🔴 Advanced / Reference
🛠️ Referensi & Praktik
- Peta Ingatan Cepat
- Tabel Ringkasan
- Cheat Code PHP 10 Detik
- Urutan Belajar yang Disarankan
- Mini Project: Aplikasi Kasir & Inventaris CLI Interaktif
- Referensi Resmi
1. 🟢 Pengenalan PHP & Mental Model Server-Side
Konsep
PHP (Hypertext Preprocessor) adalah bahasa pemrograman yang berjalan di sisi server (server-side).
Bayangkan seperti dapur restoran:
- Kode PHP bekerja di dapur (server) untuk memasak dan memproses data.
- Pelanggan di meja makan (browser/user) hanya menerima hidangan yang sudah jadi (tampilan HTML atau data JSON), tanpa pernah melihat proses atau resep rahasia di dapurnya.
Ciri khas utama PHP:
- Server-Side: Kode program berjalan di server, pengunjung website hanya menerima hasil akhirnya.
- Tipe Data Otomatis (Dynamically Typed): Kita tidak perlu repot mendeklarasikan tipe data secara manual, PHP akan menebaknya otomatis.
- Bisa Disisipkan ke HTML: Kode PHP bisa langsung dimasukkan ke dalam file HTML.
- Ekosistem Sangat Luas: Menjadi fondasi WordPress, Laravel, dan jutaan website di seluruh dunia.
Contoh
<?php
$namaAplikasi = "Belajar PHP Modern";
$tahun = 2026;
echo "Selamat datang di $namaAplikasi ($tahun)!";Output
Selamat datang di Belajar PHP Modern (2026)!Cara Kerja
Browser User
│
│ Request URL (misal: http://localhost:8000)
▼
Server PHP
│
│ 1. Membaca file script PHP
│ 2. Mengeksekusi variabel & logika echo
│ 3. Menyusun output teks
▼
Response Hasil ke Browser
│
▼
"Selamat datang di Belajar PHP Modern (2026)!"Hafalan:
Server-side → Kode dijalankan di server sebelum halaman dikirim ke browser
Dynamic type → Variabel bisa berganti tipe data secara otomatis saat runtimeBest Practice & Kesalahan Umum
- ✅ Best Practice: Simpan file dengan ekstensi
.phpdan selalu gunakan tag pembuka standar<?php. - ❌ Kesalahan Umum: Mengira kode PHP bisa dilihat langsung melalui fitur Inspect Element / View Page Source di browser (kode PHP dieksekusi di server, hanya outputnya yang sampai ke client).
2. 🟢 Menginstall & Menjalankan PHP CLI Server
Konsep
Untuk menjalankan file PHP di komputer, kita bisa menggunakan terminal (command line).
Kabar baiknya, PHP sudah menyediakan server lokal bawaan (Built-in Web Server). Artinya, saat baru belajar kita tidak perlu menginstall software web server tambahan yang berat (seperti Apache atau Nginx)—cukup ketik satu perintah di terminal, dan web server lokal langsung siap digunakan.
Contoh Perintah Terminal
Cek versi PHP di terminal:
php -vOutput:
PHP 8.3.0 (cli) (built: Nov 21 2023 14:00:00) (NTS)Menjalankan file script tunggal:
php index.phpMenjalankan built-in web server:
php -S localhost:8000Cara Kerja
Terminal / Command Prompt
│
│ php -S localhost:8000
▼
Built-in Web Server Aktif
│
│ Buka Browser: http://localhost:8000
▼
Server otomatis menyajikan file index.php di folder aktifHafalan:
php -v → Periksa versi PHP aktif
php script.php → Jalankan script langsung di terminal
php -S host:port → Jalankan development web server lokalBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan
php -S localhost:8000untuk uji coba lokal harian yang cepat dan ringan. - ❌ Kesalahan Umum: Menggunakan built-in development server untuk aplikasi production di internet publik.
3. 🟢 Program Hello World & Tag PHP
Konsep
Agar server tahu bahwa suatu baris adalah instruksi PHP, kode wajib diawali dengan tag pembuka <?php.
Aturan penting tag PHP:
- File PHP Murni: Jika file hanya berisi kode PHP saja, jangan tutup dengan
?>di akhir file. Ini adalah standar industri untuk mencegah spasi atau baris kosong liar yang bisa merusak response website. - Campur dengan HTML: Jika menyisipkan PHP di tengah-tengah dokumen HTML, barulah kita wajib menutupnya dengan
?>atau menggunakan jalan pintas cetak<?= $variabel ?>.
Contoh
File murni PHP (app.php):
<?php
echo "Hello, World!";File campuran HTML dan PHP (view.php):
<!DOCTYPE html>
<html lang="id">
<head>
<title>Hello PHP</title>
</head>
<body>
<h1><?php echo "Hello World dari PHP!"; ?></h1>
<p>Nama: <?= "Budi Santoso" ?></p>
</body>
</html>Output
Hello, World!Cara Kerja
File Input
│
┌────────────────┴────────────────┐
│ │
▼ ▼
Teks HTML Biasa Tag <?php ... ?>
│ │
▼ ▼
Langsung ke output Dieksekusi oleh PHP Engine
│ │
└────────────────┬────────────────┘
│
▼
Output BufferHafalan:
<?php → Pembuka blok kode PHP
echo $value → Mencetak satu atau beberapa nilai ke output buffer
<?= $value ?> → Short echo tag (singkatan dari <?php echo $value; ?>)Best Practice & Kesalahan Umum
- ✅ Best Practice: Hapus tag penutup
?>di baris terakhir file jika file tersebut hanya berisi kode PHP murni (PSR-12 coding standard). - ❌ Kesalahan Umum: Lupa titik koma
;di akhir statementecho.
4. 🟢 Komentar & Dokumentasi Kode
Konsep
Komentar adalah catatan pengingat di dalam kode yang tidak akan dijalankan oleh komputer.
Fungsi komentar:
- Menjelaskan mengapa suatu baris kode dibuat (bukan hanya apa yang dilakukannya).
- Menulis catatan pengingat (TODO).
- Mematikan baris kode tertentu untuk sementara waktu saat mencari error (debugging).
PHP menyediakan 3 cara menulis komentar:
//untuk komentar pendek 1 baris.#untuk komentar pendek 1 baris (gaya shell/terminal)./* ... */untuk komentar panjang yang terdiri dari banyak baris.
Contoh
<?php
// 1. Ini komentar satu baris
# Ini juga komentar satu baris
/*
2. Ini komentar multi-baris.
Sangat cocok untuk penjelasan panjang,
arsitektur logic, atau dokumentasi fungsi.
*/
$total = 100000; // Komentar inline di ujung baris
echo $total;Output
100000Cara Kerja
PHP Parser Engine
│
┌────────────────┴────────────────┐
│ │
▼ ▼
Simbol Komentar Statement Valid
(//, #, /* ... */) ($total = 100000;)
│ │
▼ ▼
Diabaikan dari AST Dikonversi ke Opcode
│
▼
EksekusiHafalan:
// text → Komentar satu baris
# text → Komentar satu baris alternatif
/* text */ → Komentar multi-barisBest Practice & Kesalahan Umum
- ✅ Best Practice: Tulis komentar yang menjelaskan alasan (WHY) di balik sebuah keputusan logika, bukan sekadar mengulang apa yang ditulis kode (WHAT).
- ❌ Kesalahan Umum: Membiarkan blok kode mati (commented-out code) berserakan di repository tanpa alasan jelas.
5. 🟢 Variable & Naming Rules
Konsep
Variabel adalah sebuah wadah untuk menyimpan data sementara di memori komputer. Isi dari wadah ini bisa kita ganti kapan saja sepanjang program berjalan.
Di PHP, nama variabel selalu diawali tanda dollar ($) dan bersifat case-sensitive (huruf besar dan kecil dianggap berbeda, misalnya $nama tidak sama dengan $Nama).
Aturan penamaan variabel:
- Wajib diawali huruf (
a-z,A-Z) atau garis bawah (_), setelah tanda$. - Tidak boleh diawali angka (contoh salah:
$1user❌). - Tidak boleh mengandung spasi atau tanda minus (contoh salah:
$user name❌,$user-name❌). - Standar penulisan modern: gunakan format camelCase (contoh:
$totalBelanja,$namaLengkap).
Contoh
<?php
$namaLengkap = "Budi Santoso";
$umur = 25;
$isMember = true;
// Mengubah nilai variabel (reassignment)
$umur = 26;
echo "Nama: " . $namaLengkap . ", Umur: " . $umur;Output
Nama: Budi Santoso, Umur: 26Cara Kerja
Deklarasi Awal: $umur = 25
│
▼
Alokasi memori lokal zval (type: int, value: 25)
│
▼ Reassignment: $umur = 26
Update memori zval (type: int, value: 26)
│
▼
echo $umur ──> Baca memori ──> Output: 26Hafalan:
$variableName = $value → Deklarasi dan inisialisasi variabel di memori
$userName → Standar penamaan camelCase yang disarankanBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan nama variabel yang deskriptif dan mencerminkan isinya (
$isLoggedIn,$productPrice,$customerList). - ❌ Kesalahan Umum: Menggunakan variabel 1 huruf yang ambigu seperti
$x,$a,$tmpuntuk data penting aplikasi.
6. 🟢 Constant (const & define)
Konsep
Constant (Konstanta) adalah sebuah nilai yang tidak dapat diubah setelah didefinisikan. Jika variabel nilainya bisa diganti-ganti, nilai konstanta akan selalu tetap sama di seluruh aplikasi.
Dua cara membuat konstanta di PHP:
const NAMA_KONSTANTA = nilai;— Cara modern dan lebih cepat, bisa digunakan di file biasa maupun di dalam class.define('NAMA_KONSTANTA', nilai);— Cara fleksibel saat program sedang berjalan (runtime), bisa diletakkan di dalam percabanganif.
Standar penamaan konstanta: selalu gunakan HURUF_KAPITAL_BESAR yang dipisah garis bawah (UPPER_SNAKE_CASE), dan tidak menggunakan tanda dollar ($).
Contoh
<?php
// Gaya modern (compile-time)
const APP_NAME = "Toko Online";
const MAX_LOGIN_ATTEMPTS = 3;
// Gaya runtime
define("DB_PORT", 3306);
echo APP_NAME . " (Max login: " . MAX_LOGIN_ATTEMPTS . ", Port: " . DB_PORT . ")";Output
Toko Online (Max login: 3, Port: 3306)Perbandingan: Variable vs Constant
Variabel ($nama) Konstanta (APP_NAME)
│ │
▼ ▼
Diawali tanda '$' Tanpa tanda '$'
│ │
▼ ▼
Nilai dapat diubah Nilai permanen (Read-Only)
│ │
▼ ▼
Local / Function Scope Otomatis Global ScopeHafalan:
const NAME = $value → Definisi konstanta compile-time (modern & cepat)
define('NAME', $value) → Definisi konstanta runtime (bisa di dalam if)Best Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan
constsebagai pilihan utama dan gunakan huruf kapital dengan pemisah garis bawah (API_KEY,BASE_URL). - ❌ Kesalahan Umum: Menambahkan tanda
$saat memanggil konstanta (misal:$APP_NAME❌, seharusnyaAPP_NAME✅).
7. 🟢 Data Types (Scalar & Compound)
Konsep
Tipe data adalah jenis informasi yang bisa disimpan dan diproses oleh PHP. Secara umum dibagi menjadi 3 kelompok:
- Scalar Types (Menyimpan 1 nilai saja):
bool: Nilai kebenaran, hanya ada dua pilihan:true(benar) ataufalse(salah).int: Bilangan bulat tanpa koma desimal (10,-5,0).float/double: Bilangan pecahan berkoma (3.14,0.5).string: Teks atau kumpulan huruf/karakter ("PHP",'Dasar').
- Compound Types (Menyimpan banyak nilai sekaligus):
array: Kumpulan data dalam satu daftar.object: Struktur data cetakan dari class (pada konsep OOP).
- Special Types (Tipe Khusus):
null: Variabel kosong yang belum memiliki nilai.resource: Penghubung ke sumber daya luar sistem (seperti koneksi database atau file yang sedang dibuka).
Contoh
<?php
$nama = "Andi"; // string
$usia = 21; // int
$berat = 65.5; // float
$isAktif = true; // bool
$catatan = null; // null
$hobi = ["Coding", "Baca"];// array
echo gettype($nama) . PHP_EOL;
echo gettype($usia) . PHP_EOL;
echo gettype($berat) . PHP_EOL;
echo gettype($isAktif) . PHP_EOL;
echo gettype($catatan) . PHP_EOL;Output
string
integer
double
boolean
NULLHirarki Tipe Data PHP
Tipe Data PHP
│
┌───────────────────┼───────────────────┐
▼ ▼ ▼
SCALAR COMPOUND SPECIAL
(Tunggal) (Koleksi) (Khusus)
│ │ │
int, float, array, object null, resource
string, boolHafalan:
int → Bilangan bulat (1, 2, -10)
float → Bilangan pecahan desimal (3.14, 0.99)
bool → True atau false
string → Teks diapit petik ("abc", 'abc')
null → Representasi nilai kosong tanpa tipeBest Practice & Kesalahan Umum
- ✅ Best Practice: Ketahui perbedaan antara integer
0, string"0", string kosong"", dannullsaat pengecekan kondisi. - ❌ Kesalahan Umum: Membandingkan angka float dengan
===secara langsung tanpa toleransi pembulatan (epsilon) karena presisi aritmatika biner float.
8. 🟢 String Dasar, Heredoc & Nowdoc
Konsep
String adalah teks yang diapit tanda petik. PHP menyediakan 4 cara penulisan string sesuai kebutuhan:
- Petik Tunggal (
'...'): Menampilkan teks apa adanya. Variabel di dalamnya tidak akan dibaca (misalnya$namatetap tercetak sebagai teks$nama). - Petik Ganda (
"..."): Teks pintar yang bisa langsung membaca isi variabel di dalamnya (interpolasi), serta mengenali simbol khusus seperti baris baru (\n). - Heredoc (
<<<TAG ... TAG;): Untuk menulis teks panjang yang terdiri dari banyak baris dan tetap bisa membaca isi variabel. - Nowdoc (
<<<'TAG' ... TAG;): Untuk menulis teks panjang banyak baris apa adanya secara murni tanpa membaca variabel (seperti petik tunggal versi panjang).
Contoh
<?php
$bahasa = "PHP";
// Single vs Double Quote
echo 'Belajar $bahasa\n'; // Tidak diinterpolasi
echo PHP_EOL;
echo "Belajar $bahasa\n"; // Diinterpolasi
// Heredoc (mendukung variabel)
$templateEmail = <<<EMAIL
Halo Pembaca,
Selamat belajar $bahasa di cheatsheet ini!
EMAIL;
// Nowdoc (literal tanpa variabel)
$rawCode = <<<'CODE'
Gunakan syntax $bahasa untuk menulis kode.
CODE;
echo $templateEmail . PHP_EOL;
echo $rawCode;Output
Belajar $bahasa\n
Belajar PHP
Halo Pembaca,
Selamat belajar PHP di cheatsheet ini!
Gunakan syntax $bahasa untuk menulis kode.Evaluasi Teks String
Double Quote / Heredoc Single Quote / Nowdoc
│ │
▼ ▼
Scan variabel ($bahasa) Teks murni apa adanya
│ │
▼ ▼
Gantikan dengan isi variabel Tidak ada interpolasi
│ │
▼ ▼
"Belajar PHP" 'Belajar $bahasa'Hafalan:
'text' → Single quote: literal murni, variabel tidak dibaca
"text $var" → Double quote: membaca isi variabel di dalam teks
<<<TAG ... TAG → Heredoc: multi-baris + interpolasi variabel
<<<'TAG' ... TAG → Nowdoc: multi-baris literal tanpa interpolasi variabelBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan kurung kurawal
{$variable}saat interpolasi variabel kompleks di dalam double quote (contoh:"Total: {$item->price}"). - ❌ Kesalahan Umum: Menaruh spasi atau karakter liar setelah tag penutup Heredoc/Nowdoc.
9. 🟢 Array Dasar (Indexed & Associative)
Konsep
Array adalah variabel super yang bisa menyimpan banyak data sekaligus dalam satu wadah (seperti daftar belanja).
Di PHP, ada dua jenis array utama:
- Indexed Array (Daftar Berurutan): Datanya diberi nomor urut otomatis (index) yang dimulai dari angka
0. - Associative Array (Daftar Berlabel): Datanya diberi label nama (key) berupa teks yang memiliki arti jelas, seperti
'nama','email', atau'harga'.
Penulisan modern selalu menggunakan tanda kurung siku [] yang ringkas dan bersih.
Contoh
<?php
// 1. Indexed Array
$daftarBuah = ["Apel", "Jeruk", "Mangga"];
echo "Buah pertama: " . $daftarBuah[0] . PHP_EOL;
// Menambah elemen baru ke index terakhir
$daftarBuah[] = "Pisang";
// 2. Associative Array
$pengguna = [
"username" => "budisantoso",
"email" => "budi@example.com",
"role" => "Admin"
];
echo "Role: " . $pengguna["role"] . PHP_EOL;
// 3. Array Bersarang (Multidimensional)
$daftarProduk = [
["id" => 1, "nama" => "Laptop", "harga" => 12000000],
["id" => 2, "nama" => "Mouse", "harga" => 250000],
];
echo "Produk 1: " . $daftarProduk[0]["nama"];Output
Buah pertama: Apel
Role: Admin
Produk 1: LaptopStruktur Key-Value Array
Indexed Array (Key Angka) Associative Array (Key String)
┌─────┬──────────┐ ┌────────────┬──────────────────┐
│ 0 │ "Apel" │ │ "username" │ "budisantoso" │
│ 1 │ "Jeruk" │ │ "email" │ "budi@gmail.com" │
│ 2 │ "Mangga" │ │ "role" │ "Admin" │
└─────┴──────────┘ └────────────┴──────────────────┘Hafalan:
$array = ['a', 'b'] → Indexed array (akses: $array[0])
$array = ['key' => 'value'] → Associative array (akses: $array['key'])
$array[] = $value → Menambahkan elemen baru ke index paling belakangBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan associative array jika kumpulan data memiliki atribut dengan makna jelas (
name,price,status). - ❌ Kesalahan Umum: Mengakses key yang tidak terdefinisi (
$pengguna["alamat"]) tanpa pengecekan, yang menghasilkan pesan Warning: Undefined array key.
10. 🟢 Debugging dengan var_dump() & print_r()
Konsep
Saat membuat program, sering kali ada data yang tidak tampil seperti perkiraan kita. Untuk mencari penyebabnya (debugging), PHP menyediakan fungsi “kaca pembesar” bawaan untuk mengintip isi variabel:
var_dump($variable): Menampilkan isi variabel secara sangat detail, lengkap dengan jenis tipe data dan panjang karakternya (sangat cocok saat mencari bug tipe data).print_r($variable): Menampilkan susunan array atau objek dalam format yang lebih ringkas dan nyaman dibaca manusia.
Contoh
<?php
$data = [
"nama" => "Budi",
"skor" => 95,
"lulus" => true
];
echo "--- Hasil print_r ---" . PHP_EOL;
print_r($data);
echo PHP_EOL . "--- Hasil var_dump ---" . PHP_EOL;
var_dump($data);Output
--- Hasil print_r ---
Array
(
[nama] => Budi
[skor] => 95
[lulus] => 1
)
--- Hasil var_dump ---
array(3) {
["nama"]=>
string(4) "Budi"
["skor"]=>
int(95)
["lulus"]=>
bool(true)
}Cara Kerja Debugging
Variabel Input ($data)
│
┌───────────────────┴───────────────────┐
│ │
▼ ▼
print_r() var_dump()
│ │
▼ ▼
Struktur Pohon Ringkas Metadata Tipe + Panjang + Nilai
(Cepat & Mudah Dibaca) (Sangat Rinci & Diagnostik Bug)Hafalan:
var_dump($value) → Debugging mendalam (menampilkan tipe data & ukuran)
print_r($value) → Debugging cepat yang mudah dibaca manusiaBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan
var_dump()saat mendiagnosis bug tipe data (misal: membedakan booleanfalse, string"0", dan integer0). - ❌ Kesalahan Umum: Lupa menghapus baris
var_dump()saat kode dirilis ke server production.
11. 🟢 Expression, Statement, dan Block
Konsep
Memahami 3 istilah dasar ini akan membuat Anda jauh lebih mudah membaca penjelasan kode:
- Expression (Ekspresi): Segala potongan kode yang menghasilkan suatu nilai (misalnya
5 + 2,100, atau$a > 10). - Statement (Pernyataan): Satu baris instruksi utuh yang memerintahkan komputer melakukan sesuatu, selalu diakhiri tanda titik koma
;(misalnya$total = 5 + 2;). - Block (Blok Kode): Kumpulan beberapa baris instruksi yang dibungkus bersama di dalam tanda kurung kurawal
{ ... }untuk dijalankan sebagai satu kesatuan.
Contoh
<?php
// Expression: 10 + 5 menghasilkan 15
// Statement: seluruh baris penugasan diakhiri ;
$total = 10 + 5;
// Block: kumpulan statement di dalam { ... }
if ($total > 10) {
$diskon = 2000;
$bayar = $total - $diskon;
echo "Total bayar: " . $bayar;
}Output
Total bayar: 13Cara Kerja
Expression (10 + 5)
│
▼ dievaluasi menghasilkan nilai (15)
Statement ($total = 15;)
│
▼ dieksekusi dalam urutan instruksi
Block { statement 1; statement 2; }Hafalan:
Expression → Menghasilkan sebuah nilai (misal: $a > 5, 2 * 3)
Statement → Satu baris instruksi utuh yang diakhiri tanda titik koma (;)
Block → Kumpulan statement yang dibungkus kurung kurawal { ... }Best Practice & Kesalahan Umum
- ✅ Best Practice: Berikan indentasi 4 spasi yang rapi di dalam setiap blok kurung kurawal untuk kemudahan membaca alur kode.
- ❌ Kesalahan Umum: Meletakkan titik koma
;langsung setelah tanda kurung kondisiif ($a > 10); { ... }yang menyebabkan blok kode selalu tereksekusi.
12. 🟢 Operator Aritmatika
Konsep
Operator aritmatika adalah simbol-simbol matematika dasar yang kita gunakan untuk melakukan perhitungan angka pada PHP:
+: Penjumlahan (tambah)-: Pengurangan (kurang)*: Perkalian (kali)/: Pembagian (bagi)%: Modulo (sisa dari hasil pembagian, misalnya10 % 3bersisa1)**: Pangkat (misalnya2 ** 3artinya 2 pangkat 3 = 8)
Contoh
<?php
$a = 10;
$b = 3;
echo "Tambah: " . ($a + $b) . PHP_EOL;
echo "Kurang: " . ($a - $b) . PHP_EOL;
echo "Kali: " . ($a * $b) . PHP_EOL;
echo "Bagi: " . ($a / $b) . PHP_EOL;
echo "Sisa Bagi: " . ($a % $b) . PHP_EOL;
echo "Pangkat: " . ($a ** $b) . PHP_EOL;Output
Tambah: 13
Kurang: 7
Kali: 30
Bagi: 3.3333333333333
Sisa Bagi: 1
Pangkat: 1000Cara Kerja
Operasi Modulo: 10 % 3
│
▼
10 dibagi 3 = 3 (3 x 3 = 9)
│
▼
Sisa Pembagian = 1Hafalan:
$a + $b → Penjumlahan
$a - $b → Pengurangan
$a * $b → Perkalian
$a / $b → Pembagian
$a % $b → Modulo (sisa pembagian)
$a ** $b → Pangkat ($a pangkat $b)Best Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan tanda kurung
(...)untuk memperjelas urutan prioritas operasi matematika jika ekspresi cukup panjang. - ❌ Kesalahan Umum: Melakukan operasi pembagian dengan angka 0 (
$a / 0), yang menghasilkanDivisionByZeroErrordi PHP 8+.
13. 🟢 Operator Penugasan (Assignment)
Konsep
Operator penugasan (assignment) digunakan untuk memasukkan suatu nilai ke dalam variabel.
Simbol dasarnya adalah sama dengan (=). Selain itu, PHP menyediakan jalan pintas operator gabungan agar kita tidak perlu mengetik nama variabel dua kali saat ingin menambah atau mengubah nilainya:
$total += 5000(artinya:$total = $total + 5000)$teks .= " dunia"(artinya: menyambung teks baru ke ujung teks lama)
Contoh
<?php
$saldo = 100000;
$saldo += 50000; // Sama dengan: $saldo = $saldo + 50000
$saldo -= 20000; // Sama dengan: $saldo = $saldo - 20000
$saldo *= 2; // Sama dengan: $saldo = $saldo * 2
$teks = "Selamat ";
$teks .= "Datang!"; // Menggabungkan string (concatenation)
echo "Saldo: " . $saldo . PHP_EOL;
echo "Pesan: " . $teks;Output
Saldo: 260000
Pesan: Selamat Datang!Alur Eksekusi Assignment
$saldo += 50000
│
▼
Baca nilai $saldo saat ini (100000)
│
▼
Tambahkan 50000 (100000 + 50000 = 150000)
│
▼
Simpan kembali ke $saldo ($saldo = 150000)Hafalan:
$a += $value → Tambahkan $value ke $a ($a = $a + $value)
$a -= $value → Kurangkan $value dari $a ($a = $a - $value)
$a *= $value → Kalikan $a dengan $value
$a /= $value → Bagikan $a dengan $value
$a .= $value → Gabungkan teks string $value ke $aBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan
$string .= "teks"untuk menyusun teks panjang di dalam perulangan agar kode lebih ringkas. - ❌ Kesalahan Umum: Tertukar antara penugasan
=dengan perbandingan kesamaan==di dalam kondisiif.
14. 🟢 Operator Perbandingan (Strict vs Loose)
Konsep
Operator perbandingan digunakan untuk membandingkan dua nilai. Hasilnya selalu berupa nilai kebenaran: true (benar) atau false (salah).
Perbedaan paling penting di PHP:
- Strict Comparison (
===dan!==): Mengecek nilai dan tipe datanya secara ketat. Angka100tidak sama dengan teks"100". Ini adalah standar yang wajib selalu digunakan. - Loose Comparison (
==dan!=): Hanya mengecek nilainya saja dan mencoba mengubah tipe data secara otomatis. Cara ini rawan menimbulkan celah bug yang sulit dilacak.
Operator lainnya mencakup <, >, <=, >=, serta spaceship operator (<=>) untuk perbandingan tiga arah (-1, 0, 1).
Contoh
<?php
$angka = 100;
$teks = "100";
// Loose comparison
var_dump($angka == $teks); // bool(true) karena nilainya dianggap sama
// Strict comparison (SANGAT DIREKOMENDASIKAN)
var_dump($angka === $teks); // bool(false) karena int !== string
// Spaceship operator
echo (5 <=> 10) . PHP_EOL; // -1 (kiri lebih kecil)
echo (10 <=> 10) . PHP_EOL; // 0 (sama besar)
echo (15 <=> 10) . PHP_EOL; // 1 (kiri lebih besar)Output
bool(true)
bool(false)
-1
0
1Perbandingan Loose vs Strict
Operasi Hasil Loose (==) Hasil Strict (===)
──────────────────────────────────────────────────────────
100 == "100" true false (int vs string)
0 == false true false (int vs bool)
"" == null true false (string vs null)Hafalan:
$a === $b → Identik: sama nilai dan sama tipe data (wajib default)
$a !== $b → Tidak identik: beda nilai atau beda tipe data
$a <=> $b → Spaceship: -1 ($a < $b), 0 ($a == $b), 1 ($a > $b)Best Practice & Kesalahan Umum
- ✅ Best Practice: Selalu gunakan
===dan!==secara default untuk mencegah bug akibat konversi tipe data otomatis. - ❌ Kesalahan Umum: Menggunakan
==untuk membandingkan output fungsi pencarian (sepertistrpos()), padahal index0bisa salah diartikan sebagaifalse.
15. 🟢 Operator Logika
Konsep
Operator logika digunakan saat kita perlu menggabungkan beberapa syarat/kondisi sekaligus:
&&(AND / DAN) : Bernilaitruehanya jika semua syarat terpenuhi.||(OR / ATAU) : Bernilaitruejika minimal salah satu syarat terpenuhi.!(NOT / BUKAN) : Membalikkan kondisi (mengubahtruejadifalse, atau sebaliknya).xor: Bernilaitruejika salah satu benar, tapifalsejika keduanya benar.
Selalu gunakan simbol
&&dan||daripada kataand/orkarena urutan eksekusinya jauh lebih aman dan konsisten.
Contoh
<?php
$sudahLogin = true;
$role = "admin";
$umur = 20;
// AND (&&)
if ($sudahLogin && $role === "admin") {
echo "Akses menu manajemen diizinkan." . PHP_EOL;
}
// OR (||)
if ($role === "admin" || $umur >= 21) {
echo "Boleh masuk ruangan khusus." . PHP_EOL;
}
// NOT (!)
$isBanned = false;
if (!$isBanned) {
echo "Akun dalam status aktif.";
}Output
Akses menu manajemen diizinkan.
Boleh masuk ruangan khusus.
Akun dalam status aktif.Tabel Kebenaran
Kondisi A Kondisi B A && B (AND) A || B (OR)
────────────────────────────────────────────────────────
true true true true
true false false true
false true false true
false false false falseHafalan:
$conditionA && $conditionB → AND: true jika kedua kondisi bernilai true
$conditionA || $conditionB → OR: true jika salah satu kondisi bernilai true
!$condition → NOT: negasi / pembalik nilai kebenaranBest Practice & Kesalahan Umum
- ✅ Best Practice: Selalu gunakan simbol
&&dan||daripada kata kunciand/orkarena memiliki tingkat prioritas operator (precedence) yang lebih aman dan standar. - ❌ Kesalahan Umum: Mengabaikan evaluasi short-circuit (PHP langsung berhenti mengecek kondisi kedua jika kondisi pertama pada
&&bernilaifalse).
16. 🟢 Increment dan Decrement
Konsep
Operator increment (++) adalah jalan pintas untuk menambah angka sebanyak 1, sedangkan decrement (--) untuk mengurangi angka sebanyak 1.
Posisi tanda menentukan kapan penambahan terjadi:
- Post-increment (
$a++): Ambil nilai lama dulu untuk digunakan sekarang, baru kemudian nilainya ditambah 1. - Pre-increment (
++$a): Tambah 1 terlebih dahulu sekarang juga, baru gunakan nilai barunya.
Contoh
<?php
// Post-increment
$a = 5;
$hasilPost = $a++; // $hasilPost = 5, kemudian $a menjadi 6
echo "Post: hasil=$hasilPost, a=$a" . PHP_EOL;
// Pre-increment
$b = 5;
$hasilPre = ++$b; // $b menjadi 6, kemudian $hasilPre = 6
echo "Pre: hasil=$hasilPre, b=$b";Output
Post: hasil=5, a=6
Pre: hasil=6, b=6Alur Eksekusi Post vs Pre Increment
Post-increment ($a++) Pre-increment (++$a)
│ │
▼ ▼
1. Baca nilai $a lama (5) 1. Tambah 1 ke $a (menjadi 6)
│ │
▼ ▼
2. Simpan 5 ke ekspresi 2. Baca nilai baru $a (6)
│ │
▼ ▼
3. Tambah 1 ke $a (menjadi 6) 3. Simpan 6 ke ekspresiHafalan:
$a++ → Post-increment: pakai nilai lama dulu, baru tambah 1
++$a → Pre-increment: tambah 1 dulu, baru pakai nilai baru
$a-- → Post-decrement: pakai nilai lama dulu, baru kurangi 1
--$a → Pre-decrement: kurangi 1 dulu, baru pakai nilai baruBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan post-increment
$i++sebagai format standar di bagian step perulanganfor. - ❌ Kesalahan Umum: Menulis ekspresi bertumpuk rumit seperti
$x = $a++ + ++$a;yang membingungkan alur pembacaan kode.
17. 🟢 If, Elseif, Else Statement
Konsep
Struktur percabangan if digunakan untuk membuat keputusan di dalam program: jalankan perintah tertentu hanya jika syarat/kondisi bernilai benar (true).
Jika syarat pertama tidak terpenuhi, kita bisa memberikan pilihan syarat lain menggunakan elseif, atau memberikan tindakan cadangan terakhir menggunakan else.
Contoh
<?php
$nilaiUjian = 82;
if ($nilaiUjian >= 90) {
$grade = "A (Sangat Baik)";
} elseif ($nilaiUjian >= 80) {
$grade = "B (Baik)";
} elseif ($nilaiUjian >= 70) {
$grade = "C (Cukup)";
} else {
$grade = "D (Remedial)";
}
echo "Grade Anda: " . $grade;Output
Grade Anda: B (Baik)Diagram Percabangan Bersyarat
Cek ($nilaiUjian >= 90)
│
┌────────────────┴────────────────┐
│ [ True ] │ [ False ]
▼ ▼
Grade = "A" Cek ($nilaiUjian >= 80)
│ │
│ ┌────────────────┴────────────────┐
│ │ [ True ] │ [ False ]
│ ▼ ▼
│ Grade = "B" Cek kondisi lain / else
│ │ │
└────────────────┼─────────────────────────────────┘
│
▼
SelesaiHafalan:
if ($condition) { ... } → Jalankan blok jika kondisi bernilai true
elseif ($condition) { ... } → Cabang alternatif jika kondisi sebelumnya false
else { ... } → Cabang penampung terakhir jika semua kondisi falseBest Practice & Kesalahan Umum
- ✅ Best Practice: Urutkan kondisi secara logis dari rentang nilai paling spesifik ke yang paling umum.
- ❌ Kesalahan Umum: Menulis
else if(dengan spasi) yang bisa menimbulkan kerancuan syntax pada template alternatif (if: ... endif;). Gunakanelseiftanpa spasi.
18. 🟢 Ternary & Short Ternary Operator
Konsep
Ternary Operator (?:) adalah jalan pintas untuk menulis if-else sederhana hanya dalam 1 baris kode. Formatnya: kondisi ? jika_benar : jika_salah.
PHP juga menyediakan Short Ternary ($a ?: $cadangan) yang otomatis memakai nilai $a jika ada isinya (truthy), atau memakai nilai $cadangan jika $a kosong (falsy).
Contoh
<?php
$skor = 75;
// Ternary standar
$status = ($skor >= 70) ? "Lulus" : "Tidak Lulus";
echo "Status: " . $status . PHP_EOL;
// Short Ternary (Elvis Operator)
$inputPengguna = "";
$namaTampil = $inputPengguna ?: "Anonim";
echo "Nama: " . $namaTampil;Output
Status: Lulus
Nama: AnonimCara Kerja Ternary
Evaluasi Kondisi ($skor >= 70)
│
┌────────────────┴────────────────┐
│ │
[ True ] [ False ]
│ │
▼ ▼
Hasil: "Lulus" Hasil: "Tidak Lulus"Hafalan:
$condition ? $valueIfTrue : $valueIfFalse → Ternary standar: if-else satu baris
$value ?: $fallback → Short ternary: pakai $value jika truthyBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan ternary hanya untuk penugasan nilai tunggal sederhana agar kode tetap mudah dibaca.
- ❌ Kesalahan Umum: Menumpuk (nesting) beberapa ternary dalam satu baris (misal:
$a ? $b ? 1 : 2 : 3), yang membuat kode sulit dipahami dan rawan bug.
19. 🟢 Null Coalescing Operator (?? & ??=)
Konsep
Null Coalescing Operator (??) adalah cara termudah dan teraman di PHP untuk memberikan nilai cadangan (default) jika suatu variabel belum dibuat atau bernilai null.
Tersedia juga Null Coalescing Assignment (??=) untuk langsung mengisi suatu variabel hanya jika variabel tersebut saat ini masih null atau belum ada.
Contoh
<?php
$pengaturan = [
"tema" => "dark"
];
// Mengambil nilai dengan fallback jika key tidak ditemukan
$temaAktif = $pengaturan["tema"] ?? "light";
$bahasa = $pengaturan["bahasa"] ?? "id";
echo "Tema: $temaAktif, Bahasa: $bahasa" . PHP_EOL;
// Null Coalescing Assignment
$profil = [];
$profil["role"] ??= "member"; // Diisi "member" karena belum ada key "role"
$profil["role"] ??= "admin"; // Diabaikan karena key "role" sudah ada
echo "Role: " . $profil["role"];Output
Tema: dark, Bahasa: id
Role: memberCara Kerja Null Coalescing
Pemeriksaan Nilai: $pengaturan["bahasa"]
│
┌────────────────┴────────────────┐
│ │
[ Ada & Bukan Null ] [ Null / Tidak Ada ]
│ │
▼ ▼
Pakai Nilai Asli Pakai Nilai Fallback ("id")Hafalan:
$value ?? $fallback → Kembalikan $value jika ada dan bukan null, selain itu $fallback
$variable ??= $value → Isi $variable dengan $value HANYA JIKA saat ini nullBest Practice & Kesalahan Umum
- ✅ Best Practice: Selalu gunakan
??saat membaca data input dari array request (seperti$_GET['page'] ?? 1) agar aman dari undefined index warning. - ❌ Kesalahan Umum: Mengira
??mengecek nilai booleanfalseatau string kosong"". Operator??HANYA mengeceknullatau undefined.
20. 🟢 Switch Statement
Konsep
switch digunakan saat kita ingin mencocokkan satu variabel dengan banyak kemungkinan pilihan nilai (cases).
Cara kerjanya:
- PHP mengecek pilihan dari atas ke bawah.
- Begitu ada pilihan yang cocok, kode akan dijalankan sampai bertemu kata kunci
break;(untuk keluar dari switch). - Jika tidak ada satu pun pilihan yang cocok, bagian
default:akan dijalankan sebagai cadangan.
Contoh
<?php
$opsiMenu = 2;
switch ($opsiMenu) {
case 1:
echo "Menampilkan Data Profil";
break;
case 2:
echo "Menampilkan Data Transaksi";
break;
case 3:
echo "Menampilkan Pengaturan Akun";
break;
default:
echo "Pilihan menu tidak valid!";
break;
}Output
Menampilkan Data TransaksiDiagram Alur Switch
┌───────────────────────────────────────────────┐
│ Evaluasi: switch ($opsiMenu) │
└───────┬───────────────┬───────────────┬───────┘
│ │ │
▼ ▼ ▼
case 1: case 2: default:
│ │ │
▼ ▼ ▼
Menu Profil Menu Transaksi Pilihan Tidak Valid
│ │ │
▼ ▼ ▼
break; break; break;
│ │ │
└───────────────┼───────────────┘
│
▼
Keluar SwitchHafalan:
switch ($value) { ... } → Memeriksa kesamaan $value terhadap daftar case
case $target: → Titik cabang jika nilai cocok
break; → Menghentikan eksekusi switch (mencegah fall-through)
default: → Blok fallback jika tidak ada case yang cocokBest Practice & Kesalahan Umum
- ✅ Best Practice: Selalu akhiri setiap blok
casedenganbreak;kecuali jika Anda sengaja menginginkan fall-through untuk beberapa kondisi sekaligus. - ❌ Kesalahan Umum: Mengingat bahwa
switchmelakukan perbandingan longgar (loose comparison==), yang berpotensi menghasilkan perilaku tak terduga jika membandingkan integer0dengan string.
21. 🟢 Match Expression (PHP 8+)
Konsep
match adalah fitur modern (PHP 8+) pengganti switch yang jauh lebih ringkas, aman, dan bersih.
Kelebihan utama match:
- Langsung Menghasilkan Nilai: Hasilnya bisa langsung disimpan ke dalam variabel.
- Pengecekan Ketat (
===): Membandingkan nilai sekaligus tipe datanya secara aman. - Tidak Butuh
break;: Otomatis berhenti begitu menemukan kecocokan tanpa risiko bablas. - Bisa Menggabungkan Pilihan: Beberapa pilihan yang hasilnya sama cukup dipisah tanda koma
,.
Contoh
<?php
$statusCode = 404;
$pesan = match ($statusCode) {
200, 201 => "Request Berhasil",
400 => "Bad Request",
401, 403 => "Akses Ditolak",
404 => "Halaman Tidak Ditemukan",
500 => "Internal Server Error",
default => "Status Code Tidak Dikenal",
};
echo "Hasil: " . $pesan;Output
Hasil: Halaman Tidak DitemukanPerbandingan: Switch vs Match
Fitur switch match (PHP 8+)
──────────────────────────────────────────────────────────────────────────
Sifat Statement Expression (Return value)
Perbandingan Loose (==) Strict (===)
Penghenti Wajib break; Otomatis berhenti
Kompak & Bersih Cenderung panjang Sangat ringkas & amanHafalan:
$result = match ($value) { $target => $output, default => $fallback };Best Practice & Kesalahan Umum
- ✅ Best Practice: Jadikan
matchsebagai pilihan pertama untuk pemetaan nilai/status di PHP modern. - ❌ Kesalahan Umum: Lupa menyediakan cabang
defaultjika tidak semua kemungkinan nilai tertangani, yang akan melemparUnhandledMatchError.
22. 🟢 For Loop
Konsep
for loop digunakan saat kita sudah tahu secara pasti berapa kali perulangan harus berjalan (misalnya mengulang sebanyak 5 kali atau 100 kali).
Struktur for loop terdiri dari 3 bagian penting:
for (angka_mulai; syarat_berhenti; langkah_perubahan)
Contoh
<?php
echo "Menghitung maju:" . PHP_EOL;
for ($i = 1; $i <= 5; $i++) {
echo "Nomor urut: $i" . PHP_EOL;
}
echo PHP_EOL . "Menghitung mundur kelipatan 10:" . PHP_EOL;
for ($i = 50; $i >= 10; $i -= 10) {
echo "$i ";
}Output
Menghitung maju:
Nomor urut: 1
Nomor urut: 2
Nomor urut: 3
Nomor urut: 4
Nomor urut: 5
Menghitung mundur kelipatan 10:
50 40 30 20 10 Diagram Alur For Loop
Inisialisasi Counter ($i = 1)
│
▼
Evaluasi Kondisi ($i <= 5) ───[ False ]───> Selesai Loop
│
[ True ]
▼
Jalankan Isi Blok
│
▼
Step Increment ($i++)
│
▼
(Kembali ke Evaluasi Kondisi)Hafalan:
for ($i = 0; $i < $count; $i++) { ... } → Pola loop standar dengan indeks counterBest Practice & Kesalahan Umum
- ✅ Best Practice: Hindari memanggil fungsi penghitung seperti
count($array)berulang kali di dalam bagian kondisi loopfor. Hitung panjang array sekali sebelum loop dimulai. - ❌ Kesalahan Umum: Kesalahan Off-by-one (menggunakan
<alih-alih<=atau sebaliknya).
23. 🟢 While Loop
Konsep
while loop menjalankan perintah secara berulang selama suatu syarat masih bernilai benar (true).
Pengecekan syarat dilakukan di awal. Jika sejak pertama kali dicek syaratnya sudah salah (false), maka baris kode di dalamnya tidak akan pernah dijalankan sama sekali.
Contoh
<?php
$antrean = 1;
while ($antrean <= 3) {
echo "Melayani nomor antrean: $antrean" . PHP_EOL;
$antrean++; // Increment agar kondisi akhirnya false
}Output
Melayani nomor antrean: 1
Melayani nomor antrean: 2
Melayani nomor antrean: 3Diagram Alur While Loop
Evaluasi Kondisi ($antrean <= 3) ───[ False ]───> Selesai Loop
│
[ True ]
▼
Jalankan Isi Blok
│
▼
Update Variabel Kondisi
│
▼
(Kembali ke Evaluasi Kondisi)Hafalan:
while ($condition) { ... } → Jalankan perulangan selama $condition bernilai trueBest Practice & Kesalahan Umum
- ✅ Best Practice: Pastikan variabel kondisi selalu diperbarui di dalam blok
whileagar tidak terjadi perulangan tak terhingga (infinite loop). - ❌ Kesalahan Umum: Lupa menambahkan perubahan variabel (
$antrean++), menyebabkan server hang karena infinite loop.
24. 🟢 Do While Loop
Konsep
do-while mirip dengan while, perbedaannya pengecekan syarat dilakukan di akhir.
Artinya, baris kode di dalam do-while pasti dijalankan minimal 1 kali, meskipun syaratnya sudah salah sejak awal. Ini sangat cocok untuk meminta input user terlebih dahulu sebelum dicek kebenarannya.
Contoh
<?php
$skor = 0;
do {
echo "Blok ini pasti dieksekusi minimal satu kali. Nilai skor: $skor" . PHP_EOL;
$skor++;
} while ($skor < 0); // Kondisi false sejak evaluasi pertamaOutput
Blok ini pasti dieksekusi minimal satu kali. Nilai skor: 0Diagram Alur Do-While Loop
Jalankan Isi Blok (Minimal 1x)
│
▼
Evaluasi Kondisi di Akhir
│
┌────────────────┴────────────────┐
│ │
[ True ] [ False ]
│ │
▼ ▼
(Ulangi Blok Kode) Selesai LoopHafalan:
do { ... } while ($condition); → Eksekusi minimal 1 kali, baru cek kondisi di akhirBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan
do-whileuntuk skenario interaktif yang memerlukan input user terlebih dahulu sebelum divalidasi (misal: prompt input CLI). - ❌ Kesalahan Umum: Lupa tanda titik koma
;setelah kurung penutupwhile ($condition);.
25. 🟢 Foreach Loop & Destructuring
Konsep
foreach adalah cara paling mudah dan paling sering digunakan di PHP untuk membaca seluruh isi array satu per satu dari awal sampai habis, tanpa perlu pusing menghitung jumlah data secara manual.
Kita bisa membaca nilainya saja, membaca pasangan kunci dan nilainya ($key => $value), atau langsung membongkar isinya (destructuring).
Contoh
<?php
// 1. Foreach Value Saja
$bahasa = ["PHP", "JavaScript", "SQL"];
foreach ($bahasa as $item) {
echo "Bahasa: $item" . PHP_EOL;
}
// 2. Foreach Key & Value
$profil = [
"nama" => "Budi",
"role" => "Software Engineer",
"kota" => "Jakarta"
];
foreach ($profil as $key => $value) {
echo "$key: $value" . PHP_EOL;
}
// 3. Foreach dengan Destructuring
$koordinat = [
[10, 20],
[30, 40]
];
foreach ($koordinat as [$x, $y]) {
echo "X: $x, Y: $y" . PHP_EOL;
}Output
Bahasa: PHP
Bahasa: JavaScript
Bahasa: SQL
nama: Budi
role: Software Engineer
kota: Jakarta
X: 10, Y: 20
X: 30, Y: 40Diagram Alur Foreach Loop
Array Sumber Data
│
▼
Ambil Elemen Satu per Satu
│
▼
Terapkan ke Variabel Item
│
▼
Jalankan Isi Blok Loop
│
▼
Selesai jika seluruh elemen habisHafalan:
foreach ($array as $value) → Iterasi setiap nilai elemen
foreach ($array as $key => $value) → Iterasi pasangan key dan value
foreach ($matrix as [$col1, $col2]) → Iterasi dengan array destructuringBest Practice & Kesalahan Umum
- ✅ Best Practice: Selalu prioritaskan
foreachdaripadaforkonvensional saat membaca data array. - ❌ Kesalahan Umum: Memberikan variabel referensi
&$itempadaforeachtanpa melakukanunset($item)setelah loop selesai.
26. 🟢 Break dan Continue
Konsep
Dua perintah penting untuk mengendalikan jalannya perulangan (loop):
break: Menghentikan perulangan saat itu juga dan langsung keluar dari perulangan.continue: Menghentikan putaran saat ini dan langsung melompat ke putaran berikutnya.
Keduanya bisa diberi angka opsional (misal: break 2;) jika ingin keluar dari perulangan bertingkat (nested loops).
Contoh
<?php
echo "Demo break (berhenti di angka 3):" . PHP_EOL;
for ($i = 1; $i <= 5; $i++) {
if ($i === 3) {
break; // Berhenti total
}
echo "$i ";
}
echo PHP_EOL . "Demo continue (lewati angka 3):" . PHP_EOL;
for ($i = 1; $i <= 5; $i++) {
if ($i === 3) {
continue; // Lewati angka 3
}
echo "$i ";
}Output
Demo break (berhenti di angka 3):
1 2
Demo continue (lewati angka 3):
1 2 4 5 Perbandingan Break vs Continue
Loop Berjalan
│
┌───────────────┴───────────────┐
│ │
▼ ▼
Bertemu break Bertemu continue
│ │
▼ ▼
Langsung Keluar Total Lewati Iterasi Ini &
dari Struktur Loop Lanjut ke Giliran BerikutnyaHafalan:
break → Hentikan loop dan keluar seketika
continue → Lewati iterasi saat ini, lanjut ke giliran berikutnya
break $level → Keluar dari sejumlah $level loop bersarangBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan
continuesebagai guard clause di awal blok perulangan untuk memangkas nestingifyang terlalu dalam. - ❌ Kesalahan Umum: Menggunakan
breakdi luar struktur loop atau switch, yang akan menghasilkan pesan Fatal Error: ‘break’ not in the ‘loop’ or ‘switch’ context.
27. 🟢 Manipulasi String
Konsep
Manipulasi string adalah kegiatan mengolah teks, seperti menyambung kalimat, memotong kata, menghapus spasi liar, atau mengubah huruf besar dan kecil.
Aturan utama di PHP:
- Untuk menyambung teks, gunakan tanda titik (
.), bukan tanda tambah (+). - Untuk menambahkan teks ke variabel yang sama, gunakan
.=.
Contoh
<?php
$depan = "Budi";
$belakang = "Santoso";
// 1. Concatenation (.)
$namaLengkap = $depan . " " . $belakang;
echo "Nama: " . $namaLengkap . PHP_EOL;
// 2. Pembersihan whitespace (trim)
$inputKotor = " admin@example.com \n";
$emailBersih = trim($inputKotor);
echo "Email: '$emailBersih'" . PHP_EOL;
// 3. Mengubah Huruf Besar / Kecil
echo "Upper: " . strtoupper($depan) . PHP_EOL;
echo "Lower: " . strtolower($belakang) . PHP_EOL;Output
Nama: Budi Santoso
Email: 'admin@example.com'
Upper: BUDI
Lower: santosoCara Kerja Penggabungan String
"Budi" . " " . "Santoso"
│ │ │
└──────┴────────┴──> Alokasi buffer string baru: "Budi Santoso"Hafalan:
$a . $b → Operator penggabungan string (concatenation)
$a .= $b → Tambahkan string $b ke ujung $a
trim($string) → Menghapus spasi liar di awal dan akhir teksBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan titik
.untuk menyambung string. Jangan gunakan+karena tanda+di PHP hanya berlaku untuk operasi matematika numerik. - ❌ Kesalahan Umum: Menulis
$pesan = "Total: " + $harga;yang akan memicu TypeError di PHP modern.
28. 🟢 Array Functions Esensial
Konsep
PHP menyediakan banyak fungsi bawaan siap pakai untuk mengolah data array dengan cepat tanpa perlu membuat perulangan manual:
count($array): Menghitung total jumlah isi array.in_array($cari, $array): Memeriksa apakah suatu nilai ada di dalam array.array_key_exists($key, $array): Memeriksa apakah ada label nama (key) tertentu di array.array_push($array, ...$values)/array_pop($array): Menambah / mengambil elemen di paling belakang.array_shift($array)/array_unshift($array, ...$values): Mengambil / menambah elemen di paling depan.array_map($callback, $array): Mengubah setiap isi elemen array menjadi bentuk baru.array_filter($array, $callback): Menyaring dan mengambil hanya data yang memenuhi syarat.array_merge($array1, $array2): Menggabungkan dua atau lebih array menjadi satu.sort($array)/rsort($array): Mengurutkan isi array dari kecil ke besar / sebaliknya.
Contoh
<?php
$angka = [1, 2, 3, 4, 5];
// 1. Filter angka genap
$genap = array_filter($angka, fn(int $n): bool => $n % 2 === 0);
// 2. Map (kali 10)
$kaliSepuluh = array_map(fn(int $n): int => $n * 10, $angka);
// 3. Merge array
$kategoriA = ["Elektronik", "Fashion"];
$kategoriB = ["Makanan", "Buku"];
$semuaKategori = array_merge($kategoriA, $kategoriB);
// 4. In array check
$adaBuku = in_array("Buku", $semuaKategori, true);
echo "Genap: " . implode(", ", $genap) . PHP_EOL;
echo "Kali 10: " . implode(", ", $kaliSepuluh) . PHP_EOL;
echo "Total kategori: " . count($semuaKategori) . PHP_EOL;
echo "Ada buku? " . ($adaBuku ? "Ya" : "Tidak");Output
Genap: 2, 4
Kali 10: 10, 20, 30, 40, 50
Total kategori: 4
Ada buku? YaTransformasi Array: Filter vs Map
Array Input: [1, 2, 3, 4, 5]
│
┌────────────────┴────────────────┐
│ │
▼ ▼
array_filter(n % 2 == 0) array_map(n * 10)
│ │
▼ ▼
[2, 4] (Elemen lolos) [10, 20, 30, 40, 50]Hafalan:
count($array) → Hitung total elemen array
in_array($needle, $haystack) → Periksa keberadaan nilai di dalam array
array_map($callback, $array) → Transformasi seluruh elemen array
array_filter($array, $callback) → Saring elemen array berdasarkan kriteria
array_merge($array1, $array2) → Gabungkan dua atau lebih array
implode($separator, $array) → Gabungkan elemen array menjadi satu string
explode($separator, $string) → Pecah string menjadi array berdasarkan pemisahBest Practice & Kesalahan Umum
- ✅ Best Practice: Selalu aktifkan parameter strict
$strict = truesaat menggunakanin_array($needle, $array, true). - ❌ Kesalahan Umum: Lupa bahwa urutan parameter
array_map($callback, $array)danarray_filter($array, $callback)berbeda!
29. 🟢 String Functions Esensial
Konsep
Selain menyambung teks, PHP memiliki fungsi bawaan lengkap untuk memeriksa dan membedah isi teks:
strlen($teks): Menghitung jumlah huruf / karakter pada teks.substr($teks, $mulai, $panjang): Memotong dan mengambil sebagian kalimat.str_replace($cari, $ganti, $teks): Mengganti kata tertentu dengan kata baru.str_contains($teks, $kata): (PHP 8+) Mengecek apakah suatu kata ada di dalam teks.str_starts_with($teks, $awalan): (PHP 8+) Mengecek apakah teks diawali kata tertentu.str_ends_with($teks, $akhiran): (PHP 8+) Mengecek apakah teks diakhiri kata tertentu.explode($pemisah, $teks): Memecah kalimat menjadi array berdasarkan tanda pemisah (misal spasi atau koma).
Contoh
<?php
$kalimat = "Belajar Pemrograman PHP Modern";
echo "Panjang teks: " . strlen($kalimat) . PHP_EOL;
echo "Potong teks: " . substr($kalimat, 0, 7) . PHP_EOL;
// Fitur Modern PHP 8+
var_dump(str_contains($kalimat, "PHP")); // bool(true)
var_dump(str_starts_with($kalimat, "Belajar")); // bool(true)
var_dump(str_ends_with($kalimat, "Modern")); // bool(true)
// Replace kata
$hasilReplace = str_replace("PHP", "Laravel", $kalimat);
echo "Hasil replace: " . $hasilReplace . PHP_EOL;
// Explode teks ke array
$daftarKata = explode(" ", $kalimat);
print_r($daftarKata);Output
Panjang teks: 30
Potong teks: Belajar
bool(true)
bool(true)
bool(true)
Hasil replace: Belajar Pemrograman Laravel Modern
Array
(
[0] => Belajar
[1] => Pemrograman
[2] => PHP
[3] => Modern
)Hafalan:
strlen($string) → Hitung jumlah karakter string
substr($string, $offset, $length) → Potong dan ambil substring
str_replace($search, $replace, $subject) → Ganti kata di dalam string
str_contains($haystack, $needle) → Cek apakah mengandung substring
str_starts_with($haystack, $needle) → Cek apakah diawali teks tertentu
str_ends_with($haystack, $needle) → Cek apakah diakhiri teks tertentuBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan helper modern
str_contains(),str_starts_with(), danstr_ends_with()pada PHP 8+ daripada fungsi lawasstrpos() !== false. - ❌ Kesalahan Umum: Untuk teks yang mengandung karakter multi-byte (seperti huruf beraksen atau emoji), gunakan fungsi multi-byte
mb_strlen()danmb_substr().
30. 🟢 Type Checking (is_*) & Type Casting
Konsep
- Type Checking (
is_*): Kumpulan fungsi bawaan untuk memeriksa jenis tipe data suatu variabel (menghasilkantrueataufalse), misalnyais_string(),is_int(), atauis_array(). - Type Casting: Cara mengubah tipe data variabel secara paksa dan langsung dengan menuliskan tipe baru di dalam kurung, misalnya
(int) "100"untuk mengubah teks angka menjadi bilangan bulat murni.
Contoh
<?php
$nilai = "150";
// 1. Pengecekan Type
var_dump(is_string($nilai)); // bool(true)
var_dump(is_numeric($nilai)); // bool(true) - teks angka valid
var_dump(is_int($nilai)); // bool(false) - tipe aslinya masih string
// 2. Type Casting Eksplisit
$angkaInteger = (int) $nilai;
var_dump(is_int($angkaInteger)); // bool(true)
// Contoh casting boolean
var_dump((bool) 0); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) ""); // bool(false)
var_dump((bool) "PHP");// bool(true)Output
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)Daftar Helper is_*
is_int($value) ──> Apakah integer?
is_float($value) ──> Apakah float?
is_string($value) ──> Apakah string?
is_bool($value) ──> Apakah boolean?
is_array($value) ──> Apakah array?
is_null($value) ──> Apakah bernilai null?
is_numeric($value) ──> Apakah angka atau string angka?Hafalan:
is_type($value) → Periksa apakah $value memiliki tipe data tertentu
(type) $value → Konversi tipe data $value secara eksplisit (Type Casting)Best Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan
is_numeric()saat memvalidasi input dari query string URL sebelum mengonversinya ke integer. - ❌ Kesalahan Umum: Melakukan casting array kosong
(bool) []yang menghasilkanfalse, sering terlewat oleh pemula yang mengira objek/array selalu bernilai truthy.
31. 🟢 Function Dasar & Deklarasi
Konsep
Function (Fungsi) adalah kumpulan baris perintah yang diberi nama agar bisa kita panggil berulang-ulang kapan pun dibutuhkan tanpa harus menulis ulang kode yang sama.
Fungsi membantu membagi program besar yang rumit menjadi potongan-potongan tugas kecil yang rapi dan mudah dikelola. Fungsi dibuat menggunakan kata kunci function namaFungsi() { ... }.
Contoh
<?php
// 1. Deklarasi Function
function kirimNotifikasi()
{
echo "Notifikasi: Pesanan Anda sedang diproses." . PHP_EOL;
}
// 2. Memanggil Function
kirimNotifikasi();
kirimNotifikasi();Output
Notifikasi: Pesanan Anda sedang diproses.
Notifikasi: Pesanan Anda sedang diproses.Cara Kerja Function
Deklarasi: function kirimNotifikasi() { ... }
│
▼ Disimpan di memori Zend Engine
Pemanggilan: kirimNotifikasi()
│
▼ Alihkan alur eksekusi ke blok fungsi
Jalankan Statement -> Kembali ke pemanggil setelah selesaiHafalan:
function functionName() { ... } → Deklarasi fungsi baru
functionName() → Memanggil dan mengeksekusi fungsiBest Practice & Kesalahan Umum
- ✅ Best Practice: Berikan nama fungsi yang berupa kata kerja (verb) yang jelas mencerminkan aksinya (
calculateTotal(),sendEmail(),formatDate()). - ❌ Kesalahan Umum: Mendeklarasikan dua fungsi dengan nama yang persis sama di file yang sama (Fatal Error: Cannot redeclare function).
32. 🟢 Parameter, Default Value & Named Arguments
Konsep
- Parameter: Variabel penampung yang kita siapkan saat membuat fungsi untuk menerima data dari luar.
- Argument: Nilai nyata yang kita kirimkan saat memanggil fungsi tersebut.
- Default Value: Nilai cadangan jika pemanggil fungsi tidak mengirimkan nilai apa pun.
- Named Arguments (PHP 8+): Cara mengirim nilai ke fungsi dengan menyebutkan nama parameternya secara langsung, sehingga urutan pengirimannya bebas dan tidak tertukar.
Contoh
<?php
// Function dengan default value
function buatAkun(string $nama, string $role = "Member", bool $kirimEmail = false)
{
echo "User: $nama | Role: $role | Email Verifikasi: " . ($kirimEmail ? "Ya" : "Tidak") . PHP_EOL;
}
// 1. Pemanggilan standar (posisi)
buatAkun("Budi");
buatAkun("Andi", "Admin", true);
// 2. Pemanggilan dengan Named Arguments (PHP 8+)
buatAkun(kirimEmail: true, nama: "Siti"); // Melewati parameter $roleOutput
User: Budi | Role: Member | Email Verifikasi: Tidak
User: Andi | Role: Admin | Email Verifikasi: Ya
User: Siti | Role: Member | Email Verifikasi: YaPosisi vs Named Arguments
Pemanggilan Berdasarkan Posisi:
buatAkun("Andi", "Admin", true);
│ │ │
▼ ▼ ▼
$nama $role $kirimEmail
Pemanggilan Berdasarkan Nama (Named Arguments):
buatAkun(kirimEmail: true, nama: "Siti");
│ │
▼ ▼
$kirimEmail $nama (Role otomatis pakai default)Hafalan:
function name($param = $defaultValue) → Parameter dengan nilai cadangan
name(paramName: $value) → Named arguments: kirim argument sesuai namaBest Practice & Kesalahan Umum
- ✅ Best Practice: Letakkan parameter wajib (tanpa default value) di posisi paling awal sebelum parameter opsional.
- ❌ Kesalahan Umum: Meletakkan parameter wajib setelah parameter yang memiliki default value (deprecated di PHP 8.0+).
33. 🟢 Return Value & Early Return
Konsep
Fungsi dapat mengirimkan kembali hasil perhitungannya kepada pemanggil menggunakan perintah return. Begitu perintah return dijalankan, fungsi akan langsung berhenti seketika.
Early Return adalah pola penulisan terbaik di mana kita menghentikan fungsi dan mengembalikan hasil secepat mungkin begitu ada syarat yang tidak terpenuhi, sehingga kode kita tetap rapi dan tidak memiliki percabangan if-else bersarang yang rumit.
Contoh
<?php
function hitungDiskon(int $totalBelanja): int
{
// Early return jika tidak memenuhi syarat diskon
if ($totalBelanja < 100000) {
return 0;
}
if ($totalBelanja >= 500000) {
return (int) ($totalBelanja * 0.2); // Diskon 20%
}
return (int) ($totalBelanja * 0.1); // Diskon 10%
}
$diskon1 = hitungDiskon(50000);
$diskon2 = hitungDiskon(200000);
$diskon3 = hitungDiskon(600000);
echo "Diskon 1: Rp " . $diskon1 . PHP_EOL;
echo "Diskon 2: Rp " . $diskon2 . PHP_EOL;
echo "Diskon 3: Rp " . $diskon3;Output
Diskon 1: Rp 0
Diskon 2: Rp 20000
Diskon 3: Rp 120000Alur Pola Early Return
hitungDiskon($totalBelanja)
│
▼
Cek: $totalBelanja < 100000 ───[ True ]───> return 0 (Selesai Seketika)
│ [ False ]
▼
Cek: $totalBelanja >= 500000 ──[ True ]───> return 20% (Selesai Seketika)
│ [ False ]
▼
Logika Sisa: return 10% (Selesai)Hafalan:
return $value → Mengembalikan nilai ke pemanggil dan menghentikan fungsi
return; → Menghentikan fungsi tanpa mengembalikan nilai (void)Best Practice & Kesalahan Umum
- ✅ Best Practice: Terapkan pola Early Return untuk memeriksa kondisi edge cases di baris-baris pertama fungsi.
- ❌ Kesalahan Umum: Menulis kode logika di bawah statement
returntanpa menyadari bahwa baris tersebut tidak akan pernah dieksekusi (unreachable code).
34. 🟢 Type Declaration (Scalar, Return, & Union)
Konsep
Type Declaration (Type Hinting) adalah cara kita menentukan jenis tipe data apa yang wajib dikirim ke parameter fungsi, serta tipe data apa yang wajib dihasilkan saat fungsi selesai (return type).
Manfaat Type Declaration:
- Mencegah error salah kirim data sejak awal.
- Menjadikan kode jelas dibaca (self-documenting).
- Membantu editor/IDE memberikan petunjuk (autocomplete) otomatis.
Di PHP modern kita bisa menentukan tipe tunggal (string, int), tipe kosong (void), tipe boleh null (?string), maupun gabungan beberapa tipe sekaligus menggunakan Union Type (int|float).
Contoh
<?php
// Fungsi dengan Type Declaration lengkap & Union Type
function hitungPajak(int|float $harga, float $persentasePajak = 0.11): float
{
return $harga * $persentasePajak;
}
// Fungsi nullable & return void
function cetakProfil(string $nama, ?string $kota): void
{
$lokasi = $kota ?? "Tidak Diketahui";
echo "Nama: $nama, Kota: $lokasi" . PHP_EOL;
}
$pajak = hitungPajak(100000);
echo "Pajak: Rp " . $pajak . PHP_EOL;
cetakProfil("Budi", "Surabaya");
cetakProfil("Andi", null);Output
Pajak: Rp 11000
Nama: Budi, Kota: Surabaya
Nama: Andi, Kota: Tidak DiketahuiCara Membaca Type Declaration
function hitungPajak(int|float $harga): float
│ │
│ └── Return Type: Wajib float
└── Parameter Type: Boleh int ATAU float (Union)Hafalan:
function name(type $param): returnType { ... } → Deklarasi tipe parameter & return
?type $param → Nullable: boleh bernilai tipe atau null
typeA|typeB $param → Union type (PHP 8+): boleh salah satu tipeBest Practice & Kesalahan Umum
- ✅ Best Practice: Tambahkan deklarasi tipe data pada seluruh parameter dan return type di kode PHP modern.
- ❌ Kesalahan Umum: Mengaktifkan
declare(strict_types=1);tetapi mengirimkan data string angka"10"ke fungsi yang mengharapkanint.
35. 🟢 Variable Scope (Local, Global, Static)
Konsep
Scope (Jangkauan Variabel) menentukan di area mana saja sebuah variabel bisa dibaca atau digunakan:
- Local Scope: Variabel yang dibuat di dalam sebuah fungsi hanya bisa digunakan di dalam fungsi itu sendiri dan akan langsung terhapus dari memori saat fungsi selesai berjalan.
- Global Scope: Variabel yang dibuat di luar fungsi. Variabel ini tidak bisa langsung dibaca di dalam fungsi kecuali kita mengimpornya dengan kata kunci
global. - Static Scope: Variabel lokal di dalam fungsi yang nilainya tetap diingat dan dipertahankan meskipun fungsi tersebut dipanggil berkali-kali.
Contoh
<?php
$namaAplikasi = "Toko App"; // Global Variable
function hitungTransaksi()
{
// Mengakses global variable
global $namaAplikasi;
// Static variable (mempertahankan nilai)
static $totalTransaksi = 0;
$totalTransaksi++;
echo "[$namaAplikasi] Transaksi ke: $totalTransaksi" . PHP_EOL;
}
hitungTransaksi();
hitungTransaksi();
hitungTransaksi();Output
[Toko App] Transaksi ke: 1
[Toko App] Transaksi ke: 2
[Toko App] Transaksi ke: 3Peta Lingkup Memori Scope
┌────────────────────────────────────────────────────────────┐
│ GLOBAL SCOPE │
│ $namaAplikasi = "Toko App" │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ LOCAL FUNCTION SCOPE │ │
│ │ global $namaAplikasi; (menghubungkan ke global) │ │
│ │ static $totalTransaksi; (memori bertahan) │ │
│ │ $diskon = 10000; (hilang setelah fungsi selesai) │ │
│ └──────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘Hafalan:
Local variable → Dibuat dan hanya hidup di dalam fungsi
global $var → Mengimpor variabel dari global scope ke dalam fungsi
static $var → Variabel lokal yang mempertahankan nilainya antar panggilan fungsiBest Practice & Kesalahan Umum
- ✅ Best Practice: Hindari ketergantungan pada keyword
global. Kirimkan data yang dibutuhkan fungsi secara eksplisit melalui parameter. - ❌ Kesalahan Umum: Mengakses variabel luar langsung di dalam fungsi tanpa deklarasi
globalyang akan memicu Warning: Undefined variable.
36. 🟡 Anonymous Function (Closure) & use Keyword
Konsep
Anonymous Function (atau biasa disebut Closure) adalah fungsi yang tidak memiliki nama. Fungsi ini bisa disimpan ke dalam variabel atau dikirim langsung sebagai argumen ke fungsi lain.
Jika ingin membaca variabel dari luar ke dalam Anonymous Function, kita wajib “menjinjingnya” menggunakan kata kunci use ($namaVariabel).
Contoh
<?php
$diskon = 5000;
// Anonymous function yang mengimpor $diskon dari luar
$hitungTotal = function (int $harga) use ($diskon): int {
return $harga - $diskon;
};
echo "Total Bayar: Rp " . $hitungTotal(50000) . PHP_EOL;
// Digunakan sebagai argument
$daftarAngka = [1, 2, 3];
$hasil = array_map(function (int $n): int {
return $n * $n;
}, $daftarAngka);
print_r($hasil);Output
Total Bayar: Rp 45000
Array
(
[0] => 1
[1] => 4
[2] => 9
)Cara Kerja use
Parent Scope ($diskon = 5000)
│
│ use ($diskon)
▼
Closure Function Scope
(Menduplikasi nilai $diskon ke dalam memori lokal fungsi)Hafalan:
$closure = function ($param) use ($outerVar) { ... }; → Anonymous function dengan binding useBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan closure saat membutuhkan fungsi singkat untuk satu kali pakai (seperti pada callback
array_mapatau middleware routing). - ❌ Kesalahan Umum: Mengira
use ($diskon)melakukan pass-by-reference secara default. Nilai di-copy secara by-value kecuali Anda menuliskanuse (&$diskon).
37. 🟡 Arrow Function (fn() =>)
Konsep
Arrow Function (fitur modern sejak PHP 7.4) adalah versi mini 1 baris dari Anonymous Function.
Keunggulan Arrow Function:
- Sangat pendek dan ringkas dengan sintaks
fn($param) => ekspresi. - Otomatis membaca variabel dari luar tanpa perlu menulis kata kunci
use. - Hasil perhitungannya otomatis dikembalikan (implicit return) tanpa perlu menulis
return.
Contoh
<?php
$faktorPengali = 5;
$daftarAngka = [1, 2, 3, 4];
// Menggunakan Arrow Function: otomatis mengakses $faktorPengali
$hasil = array_map(fn(int $n): int => $n * $faktorPengali, $daftarAngka);
echo "Hasil: " . implode(", ", $hasil);Output
Hasil: 5, 10, 15, 20Perbandingan: Closure vs Arrow Function
Anonymous Function Biasa Arrow Function (PHP 7.4+)
──────────────────────────────────────────────────────────────────────────
$fn = function ($n) use ($faktor) { $fn = fn($n) => $n * $faktor;
return $n * $faktor;
};Hafalan:
fn($param) => $expression → Arrow function: ringkas, auto-capture variabel luar, implicit returnBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan arrow function untuk operasi transformasi atau filter sederhana satu baris.
- ❌ Kesalahan Umum: Mencoba memasukkan multi-statement atau blok kurung kurawal
{ ... }ke dalam arrow function (arrow function hanya mendukung 1 single expression).
38. 🟡 Callback Function & callable
Konsep
Callback adalah sebuah fungsi yang kita kirimkan sebagai “titipan” ke fungsi lain, untuk dijalankan nanti ketika proses tertentu sudah selesai.
Pada parameter fungsi penerima, tipe data callback ditulis menggunakan tipe callable atau Closure.
Contoh
<?php
// Fungsi yang menerima callback
function prosesTransaksi(int $nominal, callable $pajakCalculator): void
{
$pajak = $pajakCalculator($nominal);
$total = $nominal + $pajak;
echo "Nominal: Rp $nominal | Pajak: Rp $pajak | Total: Rp $total" . PHP_EOL;
}
// 1. Mengirim Callback berupa Arrow Function
prosesTransaksi(100000, fn(int $n): float => $n * 0.11);
// 2. Mengirim Callback berupa Fungsi Bernama (Named Function)
function hitungPajakKhusus(int $n): float {
return $n * 0.05;
}
prosesTransaksi(100000, "hitungPajakKhusus");Output
Nominal: Rp 100000 | Pajak: Rp 11000 | Total: Rp 111000
Nominal: Rp 100000 | Pajak: Rp 5000 | Total: Rp 105000Alur Pemanggilan Callback
Pemanggil: prosesTransaksi(100000, $callback)
│
▼
Terima Data: $nominal = 100000
│
▼
Eksekusi Callback: $pajakCalculator(100000)
│
▼
Hitung Total Akhir & Tampilkan HasilHafalan:
callable $callback → Type hint parameter yang menerima fungsi sebagai argument
$callback($args) → Mengeksekusi callback yang dikirimkanBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan type hint
callablesaat membuat fungsi utility umum yang membutuhkan kustomisasi logic dari pemanggil. - ❌ Kesalahan Umum: Mengirim nama fungsi berupa string yang salah eja atau tidak terdefinisi, yang memicu TypeError.
39. 🟡 Variable Function
Konsep
Variable Function adalah keunikan PHP yang memungkinkan kita memanggil suatu fungsi menggunakan teks nama fungsi yang tersimpan di dalam variabel.
Jika sebuah variabel bernilai teks nama fungsi dan diikuti tanda kurung (), PHP akan otomatis mencari dan mengeksekusi fungsi yang namanya sesuai dengan isi variabel tersebut.
Contoh
<?php
function sapaPagi(string $nama): string {
return "Selamat Pagi, $nama!";
}
function sapaMalam(string $nama): string {
return "Selamat Malam, $nama!";
}
$waktu = "Pagi";
$namaFungsi = "sapa" . $waktu; // Menghasilkan string "sapaPagi"
// Memanggil fungsi secara dinamis
echo $namaFungsi("Budi") . PHP_EOL;
$waktu = "Malam";
$namaFungsi = "sapa" . $waktu; // Menghasilkan string "sapaMalam"
echo $namaFungsi("Andi");Output
Selamat Pagi, Budi!
Selamat Malam, Andi!Cara Kerja Variable Function
$namaFungsi = "sapaPagi";
│
▼
$namaFungsi("Budi");
│
▼
PHP mencari fungsi 'sapaPagi' di memori
│
▼
Eksekusi: sapaPagi("Budi")Hafalan:
$functionName = "sayHello";
$functionName(); → Menjalankan fungsi sayHello() secara dinamisBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan
function_exists($namaFungsi)terlebih dahulu sebelum mengeksekusi variable function untuk memastikan fungsi tersebut ada. - ❌ Kesalahan Umum: Memanggil variable function dari input pengguna langsung tanpa sanitasi/whitelist (potensi celah keamanan eksekusi kode liar).
40. 🟡 Recursive Function
Konsep
Recursive Function adalah fungsi yang memanggil dirinya sendiri secara berulang untuk menyelesaikan masalah bertingkat (seperti membuka boneka bersarang / Matryoshka).
Dua syarat wajib fungsi rekursif:
- Base Case (Kondisi Berhenti): Syarat mutlak kapan fungsi harus berhenti memanggil dirinya sendiri.
- Recursive Step: Pemanggilan fungsi kembali dengan nilai yang semakin mengecil mendekati kondisi berhenti.
Contoh
<?php
// Menghitung Faktorial: n! = n * (n - 1)!
function faktorial(int $n): int
{
// 1. Base Case
if ($n <= 1) {
return 1;
}
// 2. Recursive Step
return $n * faktorial($n - 1);
}
echo "5! = " . faktorial(5);Output
5! = 120Alur Eksekusi Rekursif Faktorial
faktorial(5)
│
▼
5 × faktorial(4)
│
▼
5 × 4 × faktorial(3)
│
▼
5 × 4 × 3 × faktorial(2)
│
▼
5 × 4 × 3 × 2 × faktorial(1)
│
▼
5 × 4 × 3 × 2 × 1 (Base Case Tercapai)
│
▼
Hasil Akhir = 120Hafalan:
Base Case → Kondisi penghenti agar fungsi tidak memanggil dirinya selamanya
Recursive Step → Pemanggilan fungsi kembali dengan nilai parameter yang mengecilBest Practice & Kesalahan Umum
- ✅ Best Practice: Selalu pastikan Base Case ditulis di baris paling awal fungsi rekursif.
- ❌ Kesalahan Umum: Lupa mendefinisikan Base Case, yang menyebabkan memori habis akibat infinite recursion / Maximum function nesting level reached.
41. 🟡 File Inclusion (require, include, require_once)
Konsep
File inclusion adalah cara membagi kode program kita ke dalam beberapa file terpisah agar rapi dan mudah dikelola, lalu memanggilnya kembali saat dibutuhkan.
Perbedaan 4 perintah pemanggilan file:
include: Jika file tidak ditemukan, hanya muncul peringatan (warning) dan program tetap lanjut berjalan.require: Jika file tidak ditemukan, program langsung berhenti total (fatal error).include_once: Sama sepertiinclude, namun memastikan file hanya dimuat tepat 1 kali saja.require_once: Sama sepertirequire, namun memastikan file hanya dimuat tepat 1 kali saja (standar industri yang paling sering digunakan untuk mencegah error fungsi ganda).
Contoh
File config.php:
<?php
const APP_TITLE = "Sistem Kasir";
$appVersion = "2.1.0";File utama app.php:
<?php
require_once __DIR__ . "/config.php";
echo "Aplikasi: " . APP_TITLE . " (v$appVersion)";Output
Aplikasi: Sistem Kasir (v2.1.0)Matriks Perbandingan File Inclusion
Perintah Jika File Hilang Cegah Duplikasi Ganda?
──────────────────────────────────────────────────────────────────
include Warning (Jalan terus) Tidak
require Fatal Error (Stop) Tidak
include_once Warning (Jalan terus) Ya (Hanya 1x)
require_once Fatal Error (Stop) Ya (Hanya 1x - Standar)Hafalan:
require_once __DIR__ . '/file.php' → Muat file wajib tepat 1 kali (standar industri)
__DIR__ → Magic constant: direktori file saat ini beradaBest Practice & Kesalahan Umum
- ✅ Best Practice: Selalu gunakan path absolut dengan bantuan magic constant
__DIR__(contoh:require_once __DIR__ . '/helper.php'). - ❌ Kesalahan Umum: Menggunakan
includebiasa untuk file konfigurasi database atau fungsi inti yang fatal jika hilang.
42. 🔴 Operator Array & Spread Operator (...)
Konsep
Selain fungsi biasa, PHP memiliki operator khusus untuk mengolah array dengan cepat:
- Array Union Operator (
+): Menggabungkan dua array. Jika ada kunci yang sama, data dari array sisi kiri yang akan dipertahankan. - Spread Operator (
...): (Fitur modern sejak PHP 7.4) Membongkar dan menuangkan seluruh isi array ke dalam array baru secara instan dan bersih.
Contoh
<?php
// 1. Array Union Operator (+)
$defaultSetting = ["tema" => "light", "bahasa" => "id", "zoom" => 100];
$userSetting = ["tema" => "dark", "sidebar" => "mini"];
// Array kiri ($userSetting) menang atas key yang sama
$pengaturanFinal = $userSetting + $defaultSetting;
print_r($pengaturanFinal);
// 2. Spread Operator (...) Unpacking
$buah1 = ["Apel", "Jeruk"];
$buah2 = ["Mangga", "Pisang"];
$semuaBuah = [...$buah1, "Melon", ...$buah2];
print_r($semuaBuah);Output
Array
(
[tema] => dark
[sidebar] => mini
[bahasa] => id
[zoom] => 100
)
Array
(
[0] => Apel
[1] => Jeruk
[2] => Melon
[3] => Mangga
[4] => Pisang
)Hafalan:
$arrayA + $arrayB → Array union: pertahankan key dari $arrayA jika ada duplikasi
[...$array1, ...$array2] → Spread operator: membongkar dan menggabungkan array modernBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan spread operator
[...$a, ...$b]untuk menggabungkan array terindeks numerik pada PHP 8+. - ❌ Kesalahan Umum: Mengharapkan operator union
+menimpa elemen array indexed seperti halnyaarray_merge().
43. 🔴 Reference (&) pada Variable & Parameter
Konsep
Secara default di PHP, saat kita menyalin variabel atau mengirimnya ke fungsi, nilainya akan diduplikasi (Pass by Value).
Dengan menambahkan simbol ampersand (&), kita membuat Reference (Alamat Bersama). Dua variabel akan menunjuk ke lokasi memori yang sama persis (seperti dua remote pengendali untuk satu televisi). Jika isi salah satu variabel diganti, variabel pasangannya akan otomatis ikut berubah.
Contoh
<?php
// 1. Reference pada Variabel
$namaAsli = "Budi";
$namaAlias = &$namaAsli; // Menunjuk ke memori yang sama
$namaAlias = "Andi";
echo "Nama Asli: " . $namaAsli . PHP_EOL; // Ikut berubah menjadi "Andi"
// 2. Passing by Reference pada Parameter Fungsi
function tambahkanBonus(int &$saldo, int $bonus): void
{
$saldo += $bonus; // Mengubah langsung variabel di luar fungsi
}
$dompet = 50000;
tambahkanBonus($dompet, 25000);
echo "Isi dompet setelah bonus: Rp " . $dompet;Output
Nama Asli: Andi
Isi dompet setelah bonus: Rp 75000Visualisasi Memori: By Value vs By Reference
Pass By Value ($b = $a) Pass By Reference ($b = &$a)
┌──────────┬──────────┐ ┌─────────────────────────┐
│ $a: 10 │ $b: 10 │ │ Alamat Memori (Nilai: 10│
│ (Slot 1) │ (Slot 2) │ │ $a (Asli) & $b (Alias) │
└──────────┴──────────┘ └─────────────────────────┘
Dua slot memori terpisah Satu slot memori bersamaHafalan:
$alias = &$original → Membuat variabel alias yang menunjuk ke memori yang sama
function modify(type &$param) → Parameter by-reference: modifikasi langsung data asalBest Practice & Kesalahan Umum
- ✅ Best Practice: Gunakan Passing by Reference secara hati-hati dan hemat, terutama saat memodifikasi data array berukuran sangat besar di tempat.
- ❌ Kesalahan Umum: Terlalu banyak menggunakan reference hingga menimbulkan side-effect tak terduga di mana variabel luar berubah tanpa disadari.
44. 🔴 goto Operator
Konsep
Operator goto digunakan untuk memerintahkan komputer melompat langsung ke baris kode tertentu yang diberi label (label:).
Aturan goto di PHP:
- Hanya bisa melompat di dalam file dan fungsi yang sama.
- Tidak bisa melompat masuk ke dalam fungsi atau ke dalam perulangan loop.
- Umumnya dihindari di aplikasi modern karena bisa membuat alur kode melompat-lompat dan membingungkan (spaghetti code).
Contoh
<?php
$counter = 1;
titikMulai:
echo "Counter: $counter" . PHP_EOL;
$counter++;
if ($counter <= 3) {
goto titikMulai; // Melompat kembali ke label titikMulai
}
echo "Perulangan selesai!";Output
Counter: 1
Counter: 2
Counter: 3
Perulangan selesai!Hafalan:
targetLabel: → Deklarasi titik tujuan lompatan label
goto targetLabel → Perintahkan interpreter langsung melompat ke label tujuanBest Practice & Kesalahan Umum
- ✅ Best Practice: Hindari penggunaan
gotodalam alur program aplikasi modern. Gunakan struktur standar (while,for,function,try-catch). - ❌ Kesalahan Umum: Menggunakan
gotosecara berlebihan sehingga menciptakan Spaghetti Code yang mustahil untuk di-debug dan dipelihara.
45. 🛠️ Peta Ingatan Cepat
Mental model komprehensif hubungan seluruh konsep fundamental PHP:
┌───────────────────────────────────────────────────────────────┐
│ STRUKTUR PROGRAM PHP │
└───────────────────────────────┬───────────────────────────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
PENYIMPANAN DATA KONTROL LOGIKA REUSABLE LOGIC
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ Variable ($name) │ │ If / Elseif │ │ Named Function │
│ Constant (const) │ │ Ternary (?:) │ │ Type Declaration │
│ Scalar Types │ │ Null Coal. (??) │ │ Arrow Func (fn) │
│ Indexed Array │ │ Switch / Match │ │ Anonymous (use) │
│ Assoc. Array │ │ For / Foreach │ │ Require / Include│
└──────────────────┘ └──────────────────┘ └──────────────────┘
│ │ │
└─────────────────────────────┼─────────────────────────────┘
│
▼
┌───────────────────────────────────────────────────────────────┐
│ OUTPUT / HASIL AKHIR │
│ echo $output | JSON | Terminal CLI │
└───────────────────────────────────────────────────────────────┘Peta Ringkas Operasi:
Data Masuk → Variable ($var), Array (['k' => 'v']), Data Types (int, string, bool)
Manipulasi → String Functions (strlen, substr), Array Functions (map, filter, merge)
Keputusan → Comparison (===, !==), Logical (&&, ||), If-Else, Match (PHP 8+)
Perulangan → Foreach (paling utama), For (counter), While (kondisi dinamis)
Modularitas → Function, Type Hinting, Early Return, require_once46. 📚 Tabel Ringkasan
| Fitur / Konsep | Sintaks / API Utama | Fungsi & Kegunaan |
|---|---|---|
| Cetak Output | echo $val; / print $val; | Mengirimkan teks ke response buffer |
| Konstanta | const APP_NAME = "App"; | Menyimpan nilai konstan compile-time |
| Strict Check | $a === $b / $a !== $b | Membandingkan kesamaan nilai dan tipe data |
| Fallback Null | $val ?? $fallback; | Ambil nilai jika ada dan bukan null |
| Match Expression | match ($val) { 1 => "A", default => "B" }; | Pemetaan nilai modern & strict (PHP 8+) |
| Iterasi Array | foreach ($array as $key => $val) | Perulangan elemen array paling aman |
| Filter Array | array_filter($array, $callback) | Menyaring data array berdasarkan kondisi |
| Transform Array | array_map($callback, $array) | Mengubah setiap elemen array dengan fungsi |
| Gabung Array | array_merge($a, $b) / [...$a, ...$b] | Menggabungkan beberapa array menjadi satu |
| Teks ke Array | explode($delimiter, $string) | Memecah teks string menjadi array |
| Array ke Teks | implode($glue, $array) | Menggabungkan array menjadi string utuh |
| Cek Substring | str_contains($text, "cari") | Memeriksa apakah teks mengandung kata target |
| Type Hinting | function test(int $a): string | Deklarasi tipe data parameter & return |
| Arrow Function | fn(int $x): int => $x * 2 | Fungsi anonim satu baris ringkas (auto-scope) |
| Muat File | require_once __DIR__ . '/file.php' | Memuat file dependency wajib tepat 1 kali |
47. ⚡ Cheat Code PHP 10 Detik
<?php
// 1. Variabel, Konstanta & Tipe Data
const APP_ENV = "development";
$nama = "Budi";
$umur = 25;
$isMember = true;
// 2. Array & Manipulasi Modern
$produk = [
["nama" => "Kopi", "harga" => 15000],
["nama" => "Roti", "harga" => 10000]
];
$produk[] = ["nama" => "Susu", "harga" => 12000];
// 3. Arrow Function & Array Filter
$produkMurah = array_filter($produk, fn(array $p): bool => $p["harga"] <= 12000);
// 4. Match Expression & Null Coalescing
$roleUser = $_GET["role"] ?? "guest";
$akses = match ($roleUser) {
"admin" => "Full Access",
"editor", "author" => "Edit Content",
default => "Read Only"
};
// 5. Function dengan Type Declaration & Early Return
function hitungTotal(array $items): int {
if (empty($items)) return 0;
return array_sum(array_column($items, "harga"));
}
$total = hitungTotal($produk);
echo "Total Transaksi: Rp $total | Hak Akses: $akses";48. 🧭 Urutan Belajar yang Disarankan
┌────────────────────────────────────────────────────────────┐
│ TAHAP 1: DASAR SINTAKS & ENVIRONMENT │
│ Setup CLI Server ──> Tag PHP ──> Variabel & Data Types │
└─────────────────────────────┬──────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────┐
│ TAHAP 2: OPERATOR & CONTROL FLOW │
│ Aritmatika & Strict ──> If-Else & Match ──> Foreach Loop │
└─────────────────────────────┬──────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────┐
│ TAHAP 3: STRUKTUR DATA & FUNGSI BAWAAN │
│ String Functions ──> Array Functions (map/filter) ──> is_*│
└─────────────────────────────┬──────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────┐
│ TAHAP 4: MODULARITAS & MODERN FUNCTION │
│ Function & Type Hints ──> Arrow Function ──> require_once │
└─────────────────────────────┬──────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────┐
│ TAHAP 5: PRAKTIK PROJECT & NEXT STEP │
│ Mini Project CLI Kasir ──> Siap Masuk PHP OOP & Laravel │
└────────────────────────────────────────────────────────────┘49. 🏗️ Mini Project: Aplikasi Kasir & Inventaris CLI Interaktif
Mini project ini menggabungkan seluruh konsep dasar PHP: Type Declarations, Associative Array, Arrow Functions, Array Functions (array_map, array_filter, array_sum), Control Flow (Match & If-Else), dan Modular Functions.
Kode Program (kasir.php)
<?php
declare(strict_types=1);
// 1. Data Inventaris Toko (Multidimensional Associative Array)
$inventaris = [
["id" => 1, "nama" => "Kopi Tubruk", "kategori" => "Minuman", "harga" => 12000, "stok" => 15],
["id" => 2, "nama" => "Teh Manis", "kategori" => "Minuman", "harga" => 5000, "stok" => 20],
["id" => 3, "nama" => "Roti Bakar", "kategori" => "Makanan", "harga" => 18000, "stok" => 8],
["id" => 4, "nama" => "Nasi Goreng", "kategori" => "Makanan", "harga" => 25000, "stok" => 10],
];
// 2. Fungsi Menampilkan Daftar Produk
function tampilkanMenu(array $items): void
{
echo "==================================================" . PHP_EOL;
echo " DAFTAR PRODUK & STOK TOKO " . PHP_EOL;
echo "==================================================" . PHP_EOL;
printf("%-4s | %-16s | %-8s | %-10s | %s\n", "ID", "Nama Produk", "Kategori", "Harga", "Stok");
echo "--------------------------------------------------" . PHP_EOL;
foreach ($items as $p) {
printf(
"%-4d | %-16s | %-8s | Rp %-7d | %d pcs\n",
$p["id"],
$p["nama"],
$p["kategori"],
$p["harga"],
$p["stok"]
);
}
echo "==================================================" . PHP_EOL;
}
// 3. Fungsi Menghitung Subtotal Item Keranjang Belanja
function hitungSubtotal(array $keranjang, array $inventaris): array
{
$itemDaftar = [];
foreach ($keranjang as $item) {
$produkId = $item["id"];
$qty = $item["qty"];
// Cari data produk berdasarkan ID
$produk = null;
foreach ($inventaris as $p) {
if ($p["id"] === $produkId) {
$produk = $p;
break;
}
}
if ($produk !== null) {
$subtotal = $produk["harga"] * $qty;
$itemDaftar[] = [
"nama" => $produk["nama"],
"harga" => $produk["harga"],
"qty" => $qty,
"subtotal" => $subtotal,
];
}
}
return $itemDaftar;
}
// 4. Fungsi Hitung Diskon Member (Match Expression)
function dapatkanPersentaseDiskon(string $tipeMember): float
{
return match (strtolower($tipeMember)) {
"gold" => 0.15, // Diskon 15%
"silver" => 0.10, // Diskon 10%
"bronze" => 0.05, // Diskon 5%
default => 0.00 // Non-member
};
}
// 5. Eksekusi Simulasi Transaksi Kasir
tampilkanMenu($inventaris);
// Simulasi Keranjang Belanja Pelanggan
$keranjangBelanja = [
["id" => 1, "qty" => 2], // 2x Kopi Tubruk (12.000 x 2 = 24.000)
["id" => 3, "qty" => 1], // 1x Roti Bakar (18.000 x 1 = 18.000)
["id" => 4, "qty" => 2], // 2x Nasi Goreng (25.000 x 2 = 50.000)
];
$tipeMemberPelanggan = "Gold";
$rincianItem = hitungSubtotal($keranjangBelanja, $inventaris);
$totalKotor = array_sum(array_column($rincianItem, "subtotal"));
$persenDiskon = dapatkanPersentaseDiskon($tipeMemberPelanggan);
$nominalDiskon = (int) ($totalKotor * $persenDiskon);
$totalBersih = $totalKotor - $nominalDiskon;
echo PHP_EOL . "STRUK TRANSAKSI PEMBAYARAN" . PHP_EOL;
echo "Tipe Pelanggan: Member " . strtoupper($tipeMemberPelanggan) . PHP_EOL;
echo "--------------------------------------------------" . PHP_EOL;
foreach ($rincianItem as $item) {
printf("%-16s (%d x Rp %-6d) = Rp %d\n", $item["nama"], $item["qty"], $item["harga"], $item["subtotal"]);
}
echo "--------------------------------------------------" . PHP_EOL;
echo "Total Kotor : Rp " . number_format($totalKotor, 0, ",", ".") . PHP_EOL;
echo "Diskon Member : Rp " . number_format($nominalDiskon, 0, ",", ".") . " (" . ($persenDiskon * 100) . "%)" . PHP_EOL;
echo "Total Bayar : Rp " . number_format($totalBersih, 0, ",", ".") . PHP_EOL;
echo "==================================================" . PHP_EOL;
echo "Status: Pembayaran Berhasil Disimpan!" . PHP_EOL;Output Eksekusi Program
==================================================
DAFTAR PRODUK & STOK TOKO
==================================================
ID | Nama Produk | Kategori | Harga | Stok
--------------------------------------------------
1 | Kopi Tubruk | Minuman | Rp 12000 | 15 pcs
2 | Teh Manis | Minuman | Rp 5000 | 20 pcs
3 | Roti Bakar | Makanan | Rp 18000 | 8 pcs
4 | Nasi Goreng | Makanan | Rp 25000 | 10 pcs
==================================================
STRUK TRANSAKSI PEMBAYARAN
Tipe Pelanggan: Member GOLD
--------------------------------------------------
Kopi Tubruk (2 x Rp 12000 ) = Rp 24000
Roti Bakar (1 x Rp 18000 ) = Rp 18000
Nasi Goreng (2 x Rp 25000 ) = Rp 50000
--------------------------------------------------
Total Kotor : Rp 92.000
Diskon Member : Rp 13.800 (15%)
Total Bayar : Rp 78.200
==================================================
Status: Pembayaran Berhasil Disimpan!