Bir static metot veya özellik herhangi bir nesneye değil sınıfın kendisine aittir. Statik bir metodu ClassName::method() ile çağırır ve statik bir özelliği ClassName::$property ile okursunuz; önce bir nesne oluşturmanız gerekmez. Sınıfın içinde self:: aynı üyelere başvurur.
Hiçbir yerde new Temperature() yoktur. Statik üyeler nesne durumuna ihtiyaç duymayan yardımcılar (dönüştürmeler, fabrikalar, doğrulama) ve bir sayaç gibi bütün olarak sınıfa ait veriler için kullanışlıdır.
Statik özellikler tüm nesneler tarafından paylaşılır
Normal bir özelliğin nesne başına bir değeri vardır. Statik bir özelliğin tüm sınıf için tek bir değeri vardır, bu yüzden her nesne aynısını görür. Burada her yeni User paylaşılan bir sayacı artırır ve bir sonraki ID'yi alır:
self::$nextId içindeki $ işaretine dikkat edin: statik özellikler :: sonrasında onu korur, sabitler (self::MAX) ise korumaz. Statik bir özellik yalnızca bir PHP isteği boyunca yaşar. Tipik bir web sitesinde (PHP-FPM veya Apache) her sayfa yüklemesinde baştan başlar, bu yüzden ziyaretçiler arasında veri saklama yeri değildir.
Statik metotlarda $this yoktur
Statik bir metot nesne olmadan çalışır, bu yüzden içinde $this yoktur. Statik bir metot diğer statik metotları self:: ile çağırabilir, ama normal özellikleri okuyamaz. Normal bir metodu statik olarak çağırmak da başarısız olur:
Ters yön sorun değildir: withSeparator() metodunun self::make() ile yaptığı gibi normal bir metot statik metotları çağırabilir.
self ile static: geç statik bağlama
self:: kodun yazıldığı sınıfı gösterir. static:: çalışma zamanında metodun üzerinde çağrıldığı sınıfı gösterir. Fark yalnızca kalıtımla ortaya çıkar ve en çok fabrika metotlarında önemlidir:
Post::createWithSelf() bir Model döndürür; çağıranın istediği bu neredeyse hiçbir zaman değildir. static Post olarak çözümlenir, çünkü çağrıda adı geçen sınıf odur; PHP buna geç statik bağlama der. Kalıtılması amaçlanan metotlarda static:: ve new static(), gerçekten tam bu sınıfı kastettiğinizde self:: kullanın. Aynı kural sabitler için de geçerlidir: static::TABLE bir alt sınıfın kendi TABLE sabitini alır, self::TABLE ise her zaman kodun yazıldığı sınıftakini okur.
Kalıtılan statik özellikler paylaşılır
Bir alt sınıf, kendi statik özelliğini tanımlamadıkça üst sınıfınınkini paylaşır. Bu klasik statik sürprizidir: iki alt sınıf aynı sayıya sayar.
Apples sınıfının kendi $count özelliği yoktur, bu yüzden Apples::$count Counter::$count olur ve ikisi de 2 yazdırır. Pears özelliği yeniden tanımlar ve kendi başına sayar. Bir trait içinde tanımlanan statik bir özellik farklı davranır: trait'i kullanan her sınıf ayrı bir kopya alır.
Fonksiyon içindeki statik değişkenler
static bir fonksiyon gövdesinin içinde ikinci bir anlama sahiptir: statik bir değişken değerini çağrılar arasında korur. Başlangıç değeri yalnızca fonksiyon ilk çalıştığında atanır:
İkinci slowSquare(12) hesaplamayı atlar. Statik özellikler gibi bu değerler de her isteğin sonunda sıfırlanır. Değişkenler sayfası genel olarak değişken kapsamını anlatır.
static ne zaman yanlış seçimdir
Statik metotlar kullanışlıdır ve bu da onları aşırı kullanmayı kolaylaştırır. Tüm metotları statik özellikleri okuyup yazan bir sınıf, üzerinde bir sınıf adı olan global durumdur: her çağıran onu paylaşır, testler taze bir kopya alamaz ve farklı bir uygulamayı yerine koyamazsınız.
static için iyi kullanımlar: durumu olmayan saf yardımcılar (Slug::make()), adlandırılmış yapıcılar (Color::fromHex()) ve sınıf genelindeki sabitler. Bir metot iki kullanım arasında farklı olabilecek verilere ihtiyaç duyuyorsa bir nesne ister.
Sıkça Sorulan Sorular
PHP'de statik bir metodu nasıl çağırırım?
Sınıf adı ve :: ile: MathHelper::square(4). Aynı sınıfın içinde self::square(4) veya static::square(4) kullanın. Nesne gerekmez ve statik bir metodun içinde $this yoktur.
PHP'de self ile static arasındaki fark nedir?
self:: her zaman kodun yazıldığı sınıf anlamına gelir. static:: metodun gerçekte çağrıldığı sınıf anlamına gelir ve bu bir alt sınıf olabilir; buna geç statik bağlama (late static binding) denir. Yani bir üst sınıfın create() metodunda new self() her zaman üst sınıfı, new static() ise onu hangi alt sınıf çağırdıysa onu oluşturur.
PHP'de statik özellik nedir?
public static int $count = 0; olarak tanımlanan bir özellik sınıfa aittir, bu yüzden o sınıfın (ve bir alt sınıf onu yeniden tanımlamadıkça alt sınıflarının) her nesnesinin paylaştığı tek bir değer vardır. Onu ClassName::$count veya self::$count ile okuyup yazın; $ işaretine dikkat edin.
PHP'de bir nesne üzerinde statik bir metot çağırabilir miyim?
Evet. $obj->square(4) ve $obj::square(4) ikisi de nesnenin sınıfının statik metodunu çağırır, ama içinde yine $this yoktur. Başarısız olan yön, statik olmayan bir metodu ClassName::method() olarak çağırmaktır: PHP 8'den beri bir Error fırlatır.
Statik bir metotta $this kullanabilir miyim?
Hayır. Statik bir metot nesne olmadan çalışır, bu yüzden orada $this tanımlı değildir ve onu kullanmak bir Error fırlatır ("Using $this when not in object context"). Diğer statik üyelere ulaşmak için self:: veya static:: kullanın.