Immutable & Eternal
Milik Class, Bukan Object
Keyword static membuat property atau method menjadi milik Class itu
sendiri, bukan milik instance (objek).
Artinya, kita bisa mengaksesnya TANPA membuat objek (tanpa new).
Bayangkan sebuah Tugu Batu (Monolith) di tengah kota.
Property & Method
Variabel yang nilainya dibagi (shared) ke semua instance.
class MathHelper {
public static $pi = 3.14;
}
echo MathHelper::$pi; // Akses langsung pakai ::
Fungsi yang bisa dipanggil tanpa instansiasi.
class MathHelper {
public static function add($a, $b) {
return $a + $b;
}
}
echo MathHelper::add(5, 10); // 15
Tanda titik dua ganda :: disebut Paamayim Nekudotayim.
Digunakan untuk mengakses member static, constant, atau method parent.
Jika satu objek mengubah static property, objek lain juga akan melihat perubahannya.
class Counter {
public static $count = 0;
public function __construct() {
self::$count++;
}
}
new Counter();
new Counter();
echo Counter::$count; // 2
Nilai Abadi
Nilai yang TIDAK BISA DIUBAH (Immutable) setelah didefinisikan.
Didefinisikan dengan keyword const.
Tidak perlu pakai $.
class Lingkaran {
const PI = 3.14159;
public function luas($r) {
return self::PI * $r * $r;
}
}
echo Lingkaran::PI;
Constant juga bisa punya visibility.
class Config {
public const APP_NAME = "MyApp";
private const API_KEY = "secret123";
}
Global scope.
Runtime definition.
Class scope.
Compile-time definition (lebih cepat).
Menunjuk Diri Sendiri
$this-> : Merujuk ke Object saat ini (Instance).self:: : Merujuk ke Class saat ini.Gunakan $this untuk property/method biasa.
Gunakan self:: untuk static property/method dan constant.
class User {
public static $minPassLength = 8; // Static
public $username; // Non-static
public function check() {
// Akses static pakai self::
if (strlen($this->username) < self::$minPassLength) {
return false;
}
}
}
PENTING: Di dalam static method, kita TIDAK BISA menggunakan
$this.
Kenapa? Karena static method bisa dipanggil tanpa ada objeknya.
static:: vs self::
self:: selalu merujuk ke class dimana kode itu DITULIS, bukan class yang
dipanggil saat runtime.
class A {
public static function who() { echo __CLASS__; }
public static function test() { self::who(); }
}
class B extends A {
public static function who() { echo __CLASS__; }
}
B::test(); // Output: A (Padahal kita panggil dari B)
Gunakan static:: untuk merujuk ke class yang MEMANGGIL method tersebut
(Runtime).
class A {
public static function test() { static::who(); }
}
B::test(); // Output: B (Benar!)
Gunakan saat Anda membuat method static di Parent Class yang mungkin akan di-override oleh Child Class.
PHP punya constant bawaan yang nilainya berubah tergantung konteks.
__LINE__ : Baris kode saat ini.__FILE__ : Path file saat ini.__DIR__ : Directory file saat ini.__CLASS__ : Nama class saat ini.Class yang semua isinya static method. Biasanya class ini dibuat final dan constructor-nya
private agar tidak bisa di-instansiasi.
final class Str {
private function __construct() {} // Prevent new
public static function upper($str) {
return strtoupper($str);
}
}
Mudah dipanggil (Global access).
Tidak perlu alokasi memori objek.
Sulit di-test (Mocking susah).
Global state bisa bikin bug susah dilacak.
static: Milik Class.const: Nilai tetap.self::: Class dimana kode ditulis.static::: Class pemanggil (Late Static Binding).Abadi Selamanya.