static:: ile geç bağlama
static:: ile geç bağlama (late static binding) ve self:: farkını öğrenirsin.
static:: ile geç bağlama
self:: kodun yazıldığı sınıfa bağlanır. static:: ise kodun çalıştığı anda çağrılan sınıfa bağlanır. Buna late static binding (geç bağlama) denir.
Bir ebeveyn sınıfta static::class yazarsan ve bu method bir alt sınıftan çağrılırsa, sonuç alt sınıfın adı olur. Aynı methodda self::class her zaman ebeveyn sınıfın adını verir.
Benzer şekilde new static() çağrılan sınıfın örneğini oluşturur; new self() ise yazıldığı sınıfın örneğini. Bu, fabrika (factory) methodları için çok kullanışlıdır.
LSB örneği: modelSelf ve modelStatic
Bir Base sınıfında iki method olsun: modelSelf() return self::class döndürsün, modelStatic() return static::class döndürsün. İkisini de public static function olarak tanımla.
Bir Derived extends Base alt sınıfı ekle. Derived::modelSelf() çağrısı Base döndürür (method Base içinde yazıldı). Ama Derived::modelStatic() çağrısı Derived döndürür (çağrılan sınıf Derived).
Bu davranış, fabrika methodlarında ve ORM'lerde temel bir tekniktir; ebeveyn sınıf alt sınıfın adını bilebilir.
Uygulama LSB örneği: self::class vs static::class
Bir Base sınıfı tanımla. İçinde iki static method olsun: modelSelf(): string return self::class döndürsün; modelStatic(): string return static::class döndürsün. Sonra class Derived extends Base {} boş alt sınıfı ekle. echo Derived::modelSelf() . "\n" ve echo Derived::modelStatic() . "\n" çağrılarını yaz.
Örnek çözümü göster
:class, diğeri return static::class döndürsün. class Derived extends Base {} ekle. Derived::modelSelf() 'Base', Derived::modelStatic() 'Derived' verir.
Örnek çözüm:
<?php
// self:: ve static:: farkını göster
class Base {
public static function modelSelf(): string {
return self::class;
}
public static function modelStatic(): string {
return static::class;
}
}
class Derived extends Base {}
echo Derived::modelSelf() . "\n";
echo Derived::modelStatic() . "\n";
Kendini test et
-
self:: ve static:: arasındaki fark nedir?
- self:: alt sınıfa, static:: ebeveyne referans verir
- İkisi de aynıdır, fark yoktur
- static:: yalnızca static methodlarda çalışır
- self:: yazıldığı sınıfa, static:: çağrılan sınıfa referans verir
Cevabı göster
self:: yazıldığı sınıfa, static:: çağrılan sınıfa referans verir — Doğru. self:: yazıldığı sınıfa, static:: çağrılan sınıfa bağlanır.
-
new static() ile geç bağlama
class Base { public static function create(): static { return new ____ } }Cevabı göster
class Base { public static function create(): static { return new static(); } } -
self:: ve static:: ifadelerini eşleştir
- self::class
- Yazıldığı sınıfın adı
- static::class
- Çağrılan sınıfın adı
- new self()
- Yazıldığı sınıfın örneği
- new static()
- Çağrılan sınıfın örneği