Menu

PHP static: Static Method, Static Property, self vs static

Method atau property static milik class, bukan milik objek: kamu memanggilnya dengan ClassName::method() dan membacanya dengan ClassName::$count, tanpa perlu new. Pelajari self:: vs static:: (late static binding), new static, variabel static di dalam fungsi, dan kapan static bukan alat yang tepat.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Method atau property static milik class itu sendiri, bukan milik objek mana pun. Kamu memanggil static method dengan ClassName::method() dan membaca static property dengan ClassName::$property, tanpa membuat objek terlebih dahulu. Di dalam class, self:: merujuk ke member yang sama.

Tidak ada new Temperature() di mana pun. Member static berguna untuk fungsi pembantu yang tidak butuh state objek (konversi, factory, validasi) dan untuk data yang dimiliki class secara keseluruhan, seperti sebuah penghitung.

Static property dipakai bersama oleh semua objek

Property biasa punya satu nilai per objek. Static property punya satu nilai untuk seluruh class, jadi setiap objek melihat nilai yang sama. Di sini setiap User baru menaikkan penghitung bersama dan menerima ID berikutnya:

Perhatikan tanda $ di self::$nextId: static property tetap memakainya setelah ::, sedangkan konstanta (self::MAX) tidak. Static property hanya hidup selama satu request PHP. Di website biasa (PHP-FPM atau Apache), nilainya mulai dari awal setiap kali halaman dimuat, jadi ini bukan tempat untuk menyimpan data antarpengunjung.

Static method tidak punya $this

Static method berjalan tanpa objek, jadi $this tidak ada di dalamnya. Static method bisa memanggil static method lain dengan self::, tetapi tidak bisa membaca property biasa. Memanggil method biasa secara static juga gagal:

Arah sebaliknya tidak masalah: method biasa boleh memanggil static method, seperti yang dilakukan withSeparator() dengan self::make().

self vs static: late static binding

self:: menunjuk ke class tempat kode itu ditulis. static:: menunjuk ke class tempat method itu dipanggil saat runtime. Perbedaannya hanya terlihat pada inheritance, dan paling penting untuk factory method:

Post::createWithSelf() mengembalikan sebuah Model, yang hampir tidak pernah diinginkan pemanggilnya. static merujuk ke Post karena itulah class yang disebut dalam pemanggilan; PHP menyebut ini late static binding. Pakai static:: dan new static() di method yang memang dimaksudkan untuk diwariskan, dan self:: kalau kamu benar-benar memaksudkan class yang persis itu. Aturan yang sama berlaku untuk konstanta: static::TABLE mengambil TABLE milik child itu sendiri, sedangkan self::TABLE selalu membaca konstanta di class tempat kode itu ditulis.

Static property warisan dipakai bersama

Child class memakai bersama static property milik parent-nya, kecuali child itu mendeklarasikan property-nya sendiri. Inilah kejutan klasik static: dua subclass menghitung ke dalam satu angka yang sama.

Apples tidak punya $count sendiri, jadi Apples::$count adalah Counter::$count, dan keduanya mencetak 2. Pears mendeklarasikan ulang property itu dan menghitung sendiri. Static property yang dideklarasikan di sebuah trait berperilaku berbeda: setiap class yang memakai trait itu mendapat salinannya sendiri.

Variabel static di dalam fungsi

static punya arti kedua di dalam badan fungsi: variabel static menyimpan nilainya di antara pemanggilan. Nilai awalnya hanya diberikan saat fungsi pertama kali dijalankan:

slowSquare(12) yang kedua melewati perhitungannya. Seperti static property, nilai-nilai ini kembali ke awal di akhir setiap request. Halaman variabel membahas scope variabel secara umum.

Kapan static bukan pilihan yang tepat

Static method memang praktis, dan karena itu mudah dipakai berlebihan. Class yang semua method-nya membaca dan menulis static property sebenarnya adalah state global yang diberi nama class: setiap pemanggil memakainya bersama, test tidak bisa mendapat salinan baru, dan kamu tidak bisa menggantinya dengan implementasi lain.

Pemakaian static yang baik: fungsi pembantu murni tanpa state (Slug::make()), named constructor (Color::fromHex()), dan konstanta untuk seluruh class. Kalau sebuah method butuh data yang bisa berbeda di antara dua pemakaian, method itu butuh objek.

Pertanyaan yang sering diajukan

Bagaimana cara memanggil static method di PHP?

Dengan nama class dan ::: MathHelper::square(4). Di dalam class yang sama, pakai self::square(4) atau static::square(4). Tidak perlu objek, dan di dalam static method tidak ada $this.

Apa bedanya self dan static di PHP?

self:: selalu berarti class tempat kode itu ditulis. static:: berarti class tempat method itu benar-benar dipanggil, yang bisa saja sebuah child class; ini disebut late static binding. Jadi di method create() milik parent, new self() selalu membuat parent, sedangkan new static() membuat child mana pun yang memanggilnya.

Apa itu static property di PHP?

Property yang dideklarasikan public static int $count = 0; milik class, jadi hanya ada satu nilai yang dipakai bersama oleh semua objek dari class itu (dan child-nya, kecuali child mendeklarasikannya ulang). Baca dan tulis dengan ClassName::$count atau self::$count; perhatikan tanda $-nya.

Bisakah static method dipanggil dari sebuah objek di PHP?

Bisa. $obj->square(4) dan $obj::square(4) sama-sama memanggil static method dari class objek itu, tetapi tetap tidak ada $this di dalamnya. Yang gagal justru arah sebaliknya, yaitu memanggil method non-static sebagai ClassName::method(): sejak PHP 8, ini melempar Error.

Bisakah $this dipakai di static method?

Tidak. Static method berjalan tanpa objek, jadi $this tidak terdefinisi di sana dan memakainya akan melempar Error ("Using $this when not in object context"). Pakai self:: atau static:: untuk mengakses member static lainnya.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai