CodeBlanks Logo Icon CodeBlanks

static:: ile geç bağlama

PHP kursu · Orta seviye · Ders 33/115

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

  1. 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.

  2. 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();
        }
    }
  3. 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

Orta seviye bölümündeki tüm dersler