BAB 2: VARIABEL & TIPE DATA

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

#KategoriOperator
1Arithmetic+, -, *, /, %, **
2Assignment=, +=, -=, *=, /=, %=
3Comparison==, ===, !=, !==, <, >, <=, >=
4Increment/Decrement++, --
5Logical&&, ||, !, and, or, xor
6String., .=
7Conditional?:, ??
8Spaceship<=> (PHP 7+)

1. Arithmetic Operators

php
<?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
<?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
<?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 kecil
  • 0 → sama
  • 1 → kiri lebih besar
php
<?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
<?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

?>
⚠️Perhatian

Increment/decrement hanya berlaku untuk numbers dan strings. Untuk array, null, dan boolean, tidak ada effect.

php
<?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
<?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
<?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!)

?>
💡Tip

Best Practice: Selalu gunakan && dan || (bukan and dan or) untuk menghindari precedence issues.

6. String Operators

php
<?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
<?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
<?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
<?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
<?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;

?>
PrecedenceOperator
1() (parentheses)
2++, --
3*, /, %
4+, -
5<, >, <=, >=
6==, !=, ===, !==
7&&
8`
9??
10?:
11=, +=, -=, dll
12and
13or
💡Tip

Ketika ragu, gunakan parentheses () untuk explicitly menentukan urutan operasi. Kode lebih readable dan less error-prone.

Combined Examples

php
<?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

  1. Apa output dari:

    php
    echo 10 % 3;      // ?
    echo 2 ** 4;      // ?
    echo 10 <=> 5;     // ?
    
  2. Buat kalkulator sederhana dengan operator precedence yang benar

  3. Apa bedanya && dan and? Kapan efeknya berbeda?

  4. Given $x = 5; $y = 10;, tanpa menjalankan kode, prediksi output:

    php
    echo ($x > 0 && $y < 20) ? "Yes" : "No";
    
  5. Buat validasi form sederhana:

    • Nama harus ada (tidak kosong/null)
    • Email harus ada
    • Umur harus >= 18

Summary

OperatorSimbolContoh
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

💡Tip

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