2-3: Operator
Objectives
- Memahami berbagai jenis operator di PHP
- Menggunakan arithmetic, comparison, dan logical operators
- Memahami operator precedence
- Mengenal operator spesial seperti spaceship dan null coalescing
Jenis-Jenis Operator
| # | Kategori | Operator |
|---|---|---|
| 1 | Arithmetic | +, -, *, /, %, ** |
| 2 | Assignment | =, +=, -=, *=, /=, %= |
| 3 | Comparison | ==, ===, !=, !==, <, >, <=, >= |
| 4 | Increment/Decrement | ++, -- |
| 5 | Logical | &&, ||, !, and, or, xor |
| 6 | String | ., .= |
| 7 | Conditional | ?:, ?? |
| 8 | Spaceship | <=> (PHP 7+) |
1. Arithmetic Operators
<?php
$a = 10;
$b = 3;
// Basic operations
echo $a + $b; // 13 (penjumlahan)
echo $a - $b; // 7 (pengurangan)
echo $a * $b; // 30 (perkalian)
echo $a / $b; // 3.333... (pembagian - float!)
echo $a % $b; // 1 (modulus - sisa bagi)
echo $a ** $b; // 1000 (10^3 - exponentials)
// Division selalu float
echo gettype($a / $b); // double
// Modulus
echo 17 % 5; // 2 (17 = 5*3 + 2)
echo -17 % 5; // -2 (depends on first operand sign)
// Exponentiation (PHP 5.6+)
echo 2 ** 3; // 8
echo 2 ** 10; // 1024
?>
2. Assignment Operators
<?php
$x = 10;
// Simple assignment
$y = $x;
echo $y; // 10
// Compound assignment
$x = 10;
$x += 5; // $x = $x + 5 → 15
$x -= 3; // $x = $x - 3 → 12
$x *= 2; // $x = $x * 2 → 24
$x /= 4; // $x = $x / 4 → 6
$x %= 5; // $x = $x % 5 → 1
echo $x; // 1
// String assignment
$text = "Hello";
$text .= " World"; // $text = $text . " World"
echo $text; // Hello World
?>
3. Comparison Operators
<?php
$a = 10;
$b = "10";
$c = 20;
$d = 20.0;
// Equal (nilai sama, type coercion)
var_dump($a == $b); // bool(true) - string "10" → int 10
// Identical (nilai DAN tipe sama)
var_dump($a === $b); // bool(false) - int vs string
// Not equal
var_dump($a != $b); // bool(false) - nilainya sama!
var_dump($a !== $b); // bool(true) - type berbeda!
// Greater/Less than
var_dump($a < $c); // bool(true)
var_dump($c > $a); // bool(true)
var_dump($a <= $b); // bool(true)
var_dump($c >= $d); // bool(true) - int 20 vs float 20.0
// Spaceship operator (PHP 7+)
echo $a <=> $c; // -1 (a < c)
echo $c <=> $a; // 1 (c > a)
echo $a <=> $b; // 0 (a == b)
?>
Spaceship Operator (<=>)
Return value:
-1→ kiri lebih kecil0→ sama1→ kiri lebih besar
<?php
// Sort dengan spaceship
$numbers = [5, 2, 8, 1, 9];
usort($numbers, function($a, $b) {
return $a <=> $b; // ascending
});
print_r($numbers); // [1, 2, 5, 8, 9]
// Descending
usort($numbers, function($a, $b) {
return $b <=> $a;
});
print_r($numbers); // [9, 8, 5, 2, 1]
?>
4. Increment/Decrement Operators
<?php
$x = 5;
// Pre-increment: increment SEBELUM digunakan
echo ++$x; // 6 (x jadi 6, lalu di-echo)
// Post-increment: gunakan SEBELUM increment
echo $x++; // 6 (di-echo dulu, baru increment)
echo $x; // 7
// Pre-decrement
echo --$x; // 6
// Post-decrement
echo $x--; // 6
echo $x; // 5
?>
Increment/decrement hanya berlaku untuk numbers dan strings. Untuk array, null, dan boolean, tidak ada effect.
<?php
$str = "a";
echo ++$str; // b
echo ++$str; // c
// ... z
echo ++$str; // aa (reset ke a, tambah 1 karakter)
// Boolean
$a = true;
echo ++$a; // 1 (tetapi ini undefined behavior!)
// Jangan gunakan ++ pada boolean
?>
5. Logical Operators
<?php
$a = true;
$b = false;
// AND
var_dump($a && $b); // false
var_dump($a and $b); // false (lowercase 'and' punya precedence lebih rendah!)
// OR
var_dump($a || $b); // true
var_dump($a or $b); // true (lowercase punya precedence lebih rendah)
// NOT
var_dump(!$b); // true
// XOR (exclusive or - hanya true jika SATU true, bukan keduanya)
var_dump(true xor true); // false
var_dump(true xor false); // true
var_dump(false xor true); // true
var_dump(false xor false); // false
?>
Precedence Pitfall!
<?php
$valid = true;
$has_permission = false;
// ✅ BENAR: && punya precedence lebih tinggi dari =
if ($valid && $has_permission === false) {
echo "Case 1";
}
// ⚠️ PROBLEM: 'and' precedence lebih rendah dari '='
// Ini assign $valid AND ($has_permission === false) ke $result
$result = $valid and $has_permission === false;
// Ekuivalen dengan:
($result = $valid) and ($has_permission === false);
var_dump($result); // true (bukan false!)
?>
Best Practice: Selalu gunakan && dan || (bukan and dan or) untuk menghindari precedence issues.
6. String Operators
<?php
$first = "Hello";
$last = "World";
// Concatenation
$full = $first . " " . $last;
echo $full; // Hello World
// Concatenation assignment
$message = "Hello";
$message .= " ";
$message .= "World";
echo $message; // Hello World
// String multiplication (PHP quirk)
echo "=" . str_repeat("=", 10); // ==========
// Ini ekuivalen dengan:
$line = "=";
$line = $line . str_repeat("=", 9);
?>
7. Ternary & Null Coalescing
Ternary Operator (?:)
<?php
$age = 20;
// Basic ternary
$status = ($age >= 18) ? "Dewasa" : "Anak-anak";
echo $status; // Dewasa
// Shorthand (tanpa middle operand - PHP 7.4+)
$name = $user_name ?: "Guest";
// Ekuivalen dengan: $name = $user_name ? $user_name : "Guest";
// Tanpa shorthand, jika $user_name empty string:
$user_name = "";
$name = $user_name ? $user_name : "Guest"; // Guest
$name = $user_name ?: "Guest"; // Guest
?>
Null Coalescing Operator (??)
<?php
// ?? returns first operand jika TIDAK null/undefined
// Jika null/undefined, returns second operand
$username = "Andi";
$guest = $username ?? "Guest";
echo $guest; // Andi
$username = null;
$guest = $username ?? "Guest";
echo $guest; // Guest
// Chaining
$var1 = null;
$var2 = null;
$var3 = "terakhir";
$result = $var1 ?? $var2 ?? $var3 ?? "default";
echo $result; // terakhir
?>
Ternary vs Null Coalescing
<?php
$value = null;
// Ternary - cek boolean truthiness
$result1 = $value ? $value : "default"; // "default" (null falsy)
// Null coalescing - cek NULL atau undefined
$result2 = $value ?? "default"; // "default"
$value = "";
// Ternary - empty string falsy
$result1 = $value ? $value : "default"; // "default"
// Null coalescing - empty string NOT null
$result2 = $value ?? "default"; // "" (empty string)
?>
Operator Precedence
Dari tertinggi ke terendah:
<?php
// Precedence: () → ++ -- → * / % → + - → < > <= >=
// → == != === !== → && → || → ?: → = += -= ...
// 1. Parentheses highest
echo 2 + 3 * 4; // 14 (not 20)
echo (2 + 3) * 4; // 20
// 2. Contoh kompleks
$result = 5 + 10 / 2 - 3 * 2;
$result = 5 + (10 / 2) - (3 * 2);
$result = 5 + 5 - 6;
$result = 4;
?>
| Precedence | Operator |
|---|---|
| 1 | () (parentheses) |
| 2 | ++, -- |
| 3 | *, /, % |
| 4 | +, - |
| 5 | <, >, <=, >= |
| 6 | ==, !=, ===, !== |
| 7 | && |
| 8 | ` |
| 9 | ?? |
| 10 | ?: |
| 11 | =, +=, -=, dll |
| 12 | and |
| 13 | or |
Ketika ragu, gunakan parentheses () untuk explicitly menentukan urutan operasi. Kode lebih readable dan less error-prone.
Combined Examples
<?php
// Calculator sederhana
function calculate(float $a, float $b, string $op): float|string {
switch ($op) {
case '+':
return $a + $b;
case '-':
return $a - $b;
case '*':
return $a * $b;
case '/':
return $b !== 0 ? $a / $b : "Division by zero!";
case '%':
return $b !== 0 ? $a % $b : "Modulus by zero!";
default:
return "Invalid operator!";
}
}
echo calculate(10, 3, '+'); // 13
echo calculate(10, 3, '-'); // 7
echo calculate(10, 3, '*'); // 30
echo calculate(10, 3, '/'); // 3.333...
echo calculate(10, 3, '%'); // 1
echo calculate(10, 0, '/'); // Division by zero!
?>
Exercise
-
Apa output dari:
phpecho 10 % 3; // ? echo 2 ** 4; // ? echo 10 <=> 5; // ? -
Buat kalkulator sederhana dengan operator precedence yang benar
-
Apa bedanya
&&danand? Kapan efeknya berbeda? -
Given
$x = 5; $y = 10;, tanpa menjalankan kode, prediksi output:phpecho ($x > 0 && $y < 20) ? "Yes" : "No"; -
Buat validasi form sederhana:
- Nama harus ada (tidak kosong/null)
- Email harus ada
- Umur harus >= 18
Summary
| Operator | Simbol | Contoh |
|---|---|---|
| Arithmetic | +, -, *, /, %, ** | $a + $b |
| Assignment | =, +=, -=, dll | $a += 5 |
| Comparison | ==, ===, !=, <, > | $a === $b |
| Increment | ++, -- | ++$a, $a++ |
| Logical | &&, ||, ! | $a && $b |
| String | ., .= | $a . $b |
| Ternary | ?: | $a ? $b : $c |
| Null coalescing | ?? | $a ?? $b |
| Spaceship | <=> | $a <=> $b |
PHP punya operator "spaceship" <=> yang berguna untuk sorting. Di bahasa lain ini called "three-way comparison operator".
Klik tombol ini setelah menyelesaikan materi
Quiz Bab 2
Uji pemahamanmu tentang Variabel & Tipe Data