CodeBlanks Logo Icon CodeBlanks

static vs instance

PHP kursu · Orta seviye · Ders 34/115

static ve instance üyelerin farkını ve ne zaman hangisini kullanacağını öğrenirsin.

static ve instance üyeler

Bir instance property her örneğe özeldir: $user1->name ve $user2->name farklı değerler tutabilir. Bir static property ise sınıfa aittir: User::$count tüm örnekler için tek bir değerdir.

Instance method bir örneğin üzerinden çağrılır ($user->save()), içinde $this vardır. Static method sınıf adıyla çağrılır (User::create()), $this yoktur.

Genel ilke: örnek durumu gerekiyorsa instance, örnek durumu gerekmiyorsa static kullan. Örnek: strlen gibi saf yardımcı işlevler statictir; kullanıcı verisi ise instance'tır.

static üyelerin avantaj ve dezavantajları

Static üyelerin avantajları: örnekleme gerekmez, paylaşılan durum tek yerde tutulur, çağrı hızlıdır (User::create()). Yardımcı işlevleri gruplandırmak için pratiktir.

Ama dezavantajları da vardır: static methodları mock etmek (test için değiştirmek) zordur; static property global durum yaratır ve test sırasında sıfırlanmalıdır; polymorphism (çok biçimlilik) çalışmaz.

Öneri: varsayılan olarak instance kullan; yalnızca gerçekten örnek durumu gerekmiyorsa veya ünlü bir örüntü (singleton, registry, factory) uyguluyorsan static seç. Test edilebilirlik her zaman öncelikli kriter olsun.

Uygulama BankAccount: static ve instance birlikte

Bir BankAccount sınıfı tanımla. public static int $totalAccounts = 0 static property ve public string $owner instance property olsun. Yapıcı metot $owner parametresi alsın, $this->owner = $owner yapsın ve self::$totalAccounts++ ile sayacı artırsın. public static function getTotalAccounts(): int return self::$totalAccounts döndürsün. İki hesap oluştur ve echo BankAccount::getTotalAccounts() . "\n" yaz.

Örnek çözümü göster
:$totalAccounts++ yap. static function getTotalAccounts(): int { return self::$totalAccounts; } ekle. İki new BankAccount(...) çağır, echo BankAccount::getTotalAccounts() . "\n" yaz.
Örnek çözüm:
<?php
// BankAccount: static ve instance birlikte
class BankAccount {
    public static int $totalAccounts = 0;
    public string $owner;
    public function __construct(string $owner) {
        $this->owner = $owner;
        self::$totalAccounts++;
    }
    public static function getTotalAccounts(): int {
        return self::$totalAccounts;
    }
}
new BankAccount("Ayşe");
new BankAccount("Mehmet");
echo BankAccount::getTotalAccounts() . "\n";

Kendini test et

  1. Ne zaman static method tercih etmelisin?

    • Method örnek durumu gerektirmiyorsa
    • $this'e erişmen gerekiyorsa
    • Method örneğe özel veri işliyorsa
    • Method yapıcı içinde çağrılacaksa
    Cevabı göster

    Method örnek durumu gerektirmiyorsa — Doğru. Örnek durumu gerektirmeyen saf yardımcı işlevler statictir.

  2. Instance property ataması

    class User {
        public string $name;
        public function __construct(string $name) {
            $this->name = ____
        }
    }
    Cevabı göster
    class User {
        public string $name;
        public function __construct(string $name) {
            $this->name = $name;
        }
    }
  3. static ve instance ifadelerini eşleştir

    $this->name
    Instance property erişimi
    self::$count
    Static property erişimi
    $obj->method()
    Instance method çağrısı
    Class::method()
    Static method çağrısı

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