static vs instance
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
-
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.
-
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; } } -
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ı