Merhaba! Eğer PHP ile nesne yönelimli programlama (OOP) yapıyorsanız, self, parent, static gibi keyword'ler sıkça karşınıza çıkacaktır. Bu keyword'ler, sınıflar içindeki statik üyeleri (properties ve methods) yönetmek, kalıtım (inheritance) senaryolarında doğru referanslar sağlamak ve kodunuzu daha esnek hale getirmek için kritik öneme sahiptir. Bu makalede, bu keyword'leri detaylı bir şekilde ele alacağız: Kullanımları, farkları, örnekleri, olası hatalar ve en iyi pratikleri. Ayrıca, $this pseudo-variable'ını da benzer bir kavram olarak dahil edeceğiz, çünkü statik bağlamlarda sıkça karşılaştırılır. Makale, PHP'nin resmi dokümantasyonuna dayanarak hazırlanmış olup, PHP 5.3 ve sonrası sürümleri (late static binding ile) odaklanıyor. Daha fazla kaynak ve ileri düzey örnekler için https://www.gulgec.tr adresini ziyaret edebilirsiniz.
Giriş: Statik Üyeler ve Keyword'lerin Rolü
PHP'de OOP, sınıfları ve nesneleri temel alır. Statik üyeler (static properties ve methods), sınıf seviyesinde çalışır ve nesne örneği (instance) gerektirmez. Bunlara erişim için Scope Resolution Operator (::) kullanılır. İşte keyword'lerin genel rolleri:
- self: Mevcut sınıfı referans eder, statik üyeleri erişmek için kullanılır.
- parent: Üst sınıfı (parent class) referans eder, kalıtım zincirinde üst seviyeye erişim sağlar.
- static: Late static binding'i destekler, çağrıldığı sınıfı dinamik olarak belirler (özellikle inheritance'ta faydalı).
- $this: Nesne bağlamında (non-static) kullanılır, mevcut nesneyi referans eder.
Bu keyword'ler, kodunuzu modüler ve bakım yapılabilir kılar, ancak yanlış kullanım hatalara yol açabilir. PHP 8.0'dan itibaren, statik olmayan metotları statik çağırmak hata fırlatır (önceki sürümlerde uyarıydı).
self Keyword'ü: Mevcut Sınıfı Referans Etme
self, sınıf içinden statik üyeleri erişmek için kullanılır ve her zaman tanımlandığı sınıfı işaret eder. Late static binding desteklemez, yani inheritance'ta alt sınıfı değil, tanımlandığı sınıfı kullanır.
Kullanım Alanları
- Statik properties'e erişim: self::$property
- Statik metot çağrısı: self::method()
- Sınıf sabitlerine erişim: self::CONSTANT
Örnekler
Basit bir sınıf:
<?php
class Foo {
public static $myStatic = 'Merhaba self!';
public static function getStaticValue() {
return self::$myStatic;
}
}
echo Foo::getStaticValue(); // Çıktı: Merhaba self!
?>Inheritance örneği (late static binding olmadan):
<?php
class ParentClass {
protected static $value = 'Parent Değer';
public static function getValue() {
return self::$value; // Her zaman ParentClass'ı referans eder
}
}
class ChildClass extends ParentClass {
protected static $value = 'Child Değer';
}
echo ChildClass::getValue(); // Çıktı: Parent Değer (self nedeniyle)
?>Traits içinde:
<?php
trait MyTrait {
public function test() {
echo self::class; // Trait'in kendisini referans eder
}
}
class MyClass {
use MyTrait;
}
$obj = new MyClass();
$obj->test(); // Çıktı: MyTrait (PHP 8+ behavior)
?>Farklar ve Notlar
- self, tanımlandığı sınıfı sabit tutar; inheritance'ta alt sınıfın değerlerini almaz.
- Traits'te self::class, trait'i referans eder, sınıfı değil.
- Değişkenlerle kullanılamaz (örneğin, $var = self; $var::method() hatalıdır).
En İyi Pratikler
- Statik üyeleri mevcut sınıf içinde sabit tutmak istediğinizde kullanın.
- Inheritance'ta dinamik davranış için static tercih edin.
- Traits'te dikkatli olun; self trait'e bağlı kalır.
parent Keyword'ü: Üst Sınıfı Referans Etme
parent, kalıtım zincirinde üst sınıfın statik üyelerine erişim sağlar. Özellikle overriding (ezme) sırasında üst metodu çağırmak için idealdir.
Kullanım Alanları
- Üst sınıfın statik properties'ine erişim: parent::$property
- Üst sınıfın metotlarını çağırma: parent::method()
- Constructor'larda üst constructor'ı çağırma.
Örnekler
Kalıtım örneği:
<?php
class ParentClass {
protected static $value = 'Parent Değer';
public static function greet() {
echo "Merhaba parent!";
}
}
class ChildClass extends ParentClass {
public static function getParentValue() {
return parent::$value;
}
public static function extendedGreet() {
parent::greet(); // Üst metodu çağır
echo " Child'den selam!";
}
}
echo ChildClass::getParentValue(); // Çıktı: Parent Değer
ChildClass::extendedGreet(); // Çıktı: Merhaba parent! Child'den selam!
?>Constructor overriding:
<?php
class ParentClass {
public function __construct() {
echo "Parent constructor.";
}
}
class ChildClass extends ParentClass {
public function __construct() {
parent::__construct(); // Üst constructor'ı çağır
echo " Child constructor.";
}
}
new ChildClass(); // Çıktı: Parent constructor. Child constructor.
?>Farklar ve Notlar
- parent, sadece kalıtım olan sınıflarda çalışır; yoksa hata fırlatır.
- Statik bağlamda kullanılır, ancak non-static metotlarda da üst metodu çağırabilir.
- Late static binding desteklemez; her zaman direkt üst sınıfı referans eder.
En İyi Pratikler
- Overriding sırasında üst metodu genişletmek için kullanın (super çağrısı gibi).
- Çok seviyeli inheritance'ta zinciri bozmamaya dikkat edin.
static Keyword'ü: Late Static Binding
static, late static binding'i sağlar; yani çağrıldığı sınıfı dinamik olarak belirler. Inheritance'ta alt sınıfın üyelerini tercih eder.
Kullanım Alanları
- Dinamik statik erişim: static::$property veya static::method()
- Factory pattern'lerde veya singleton'larda faydalı.
Örnekler
Late static binding:
<?php
class ParentClass {
protected static $value = 'Parent Değer';
public static function getValue() {
return static::$value; // Çağrıldığı sınıfa göre değişir
}
}
class ChildClass extends ParentClass {
protected static $value = 'Child Değer';
}
echo ChildClass::getValue(); // Çıktı: Child Değer (static nedeniyle)
?>Statik metot:
<?php
class Foo {
public static function who() {
echo static::class;
}
}
class Bar extends Foo {}
Bar::who(); // Çıktı: Bar
?>Farklar ve Notlar
- self'ten farkı: self tanımlandığı sınıfı, static çağrıldığı sınıfı kullanır.
- PHP 5.3'ten beri desteklenir; önceki sürümlerde yok.
- Statik properties, parent ve child'ta ayrı ayrı tutulur; paylaşılmaz.
En İyi Pratikler
- Inheritance'ta dinamik davranış için tercih edin.
- Statik properties'i dikkatli yönetin; unintended sharing'e yol açabilir.
$this Pseudo-Variable: Nesne Bağlamı
$this, non-static bağlamda mevcut nesneyi referans eder. Statik metotlarda kullanılamaz.
Örnek
<?php
class Foo {
public $prop = 'Merhaba this!';
public function getProp() {
return $this->prop;
}
}
$obj = new Foo();
echo $obj->getProp(); // Çıktı: Merhaba this!
?>Farklar
- Statik olmayan üyeler için: $this->property
- Statik metotlarda hata: "Using $this when not in object context"
En İyi Pratikler
- Nesne odaklı kodlarda kullanın; statik için self/static tercih edin.
Olası Hatalar ve Güvenlik İpuçları
- Statik olmayan metotları statik çağırmak: PHP 8+'te Error.
- Inheritance'ta self yerine static kullanmamak: Yanlış değerler.
- Statik properties paylaşımı: Çoklu instance'larda sorun yaratabilir.
- Güvenlik: Statik metotlarda girişleri doğrula; global state kaçın.
Sonuç
self, parent, static ve $this, PHP OOP'nin temel taşlarıdır. Doğru kullanım, kodunuzu esnek kılar. Pratik yaparak ustalaşın; inheritance senaryolarını test edin. Daha detaylı örnekler için https://www.gulgec.tr sitesini inceleyin. Sorularınız olursa yorum bırakın!
Yorumlar (0)
Henüz yorum yapılmamış. İlk yorumu siz yapın!