Kurucular ve Yıkıcılar

Kurucular

__construct ([ mixed $değiştirge = "" [, $... ]] ) : void

PHP 5 geliştiricilerin sınıflar için kurucu yöntemler bildirmesine imkan verir. Bir kurucu yöntemi olan sınıflar her yeni nesne oluşturuluşunda bu yöntemi çağırırlar, bu bakımdan nesne kullanılmadan önce yapılması gereken ilklendirmeler için kurucular çok uygundur.

Bilginize: Çocuk sınıflardan kurucusu olanlar için örtük olarak ebeveyn sınıfın kurucusu çağrılmaz. Ebeveyn sınıfın kurucusunu çocuk sınıftan çağırmak için, çocuk sınıf içinden parent::__construct() çağrısı yapılması gerekir. Çocuğun bir kurucu tanımlamaması halinde, normal sınıf yöntemi gibi (eğer private olarak tanımlanmadıysa) ana sınıftan miras alınabilir.

Örnek 1 - Yeni tekilleşmiş kurucuların kullanımı

<?php
class AnaSınıf {
   function 
__construct() {
      print 
"AnaSınıf kurucusundayız\n";
   }
}

class 
AltSınıf extends AnaSınıf {
   function 
__construct() {
      
parent::__construct();
      print 
"AltSınıf kurucusundayız\n";
   }
}

class 
DiğerAltSınıf extends AnaSınıf {
    
// AnaSınıf'ın kurucusunu miras alır
}

// AnaSınıf kurucusunda
$obj = new AnaSınıf();

// AnaSınıf kurucusunda
// AltSınıf kurucusunda
$obj = new AltSınıf();

// AnaSınıf kurucusunda
$obj = new DiğerAltSınıf();
?>

PHP 3 ve 4 ile geriye dönük uyumluluk için, PHP 5 belirtilen sınıfa ait bir __construct() yöntemi bulamazsa, sınıfın ismine bakarak eski tarz bir kurucu arayacaktır. Dolayısıyla, uyumluluk sorunu yaşayacağınız tek durum sınıf dahilinde __construct() isimli bir yöntemin amacı dışında kullanılması olabilir.

Uyarı

PHP 7.0'da eski tarz kurucuların kullanımı önerilmemekte olup ileri sürümlerde kaldırılacaktır. Yeni kodlarda daima __construct() kullanmalısınız.

Diğer yöntemlerin tersine, __construct() ebeveyn __construct() yöntemindekilerden farklı değiştirgelerle kullanılmaya çalışıldığında PHP E_STRICT seviyesinden bir hata iletisi üretmeyecektir.

PHP 5.3.3 itibariyle, bir isim alanlı sınıf isminin son elemanı ile aynı isimdeki yöntemler artık kurucu olarak ele alınmayacaktır. Bu değişiklik isim alanlı olmayan sınıfları etkilemez.

Örnek 2 - İsim alanlı sınıflarda kurucular

<?php
namespace Foo;
class 
Bar
{
    public function 
Bar()
    {
        
// PHP 5.3.0-5.3.2'de kurucu olarak ele alınır
        // PHP 5.3.3 itibariyle sıradan bir yöntem olarak ele alınır
    
}
}
?>

Yıkıcılar

__destruct ( void ) : void

PHP 5, C++ gibi nesne yönelimli dillerdekine benzer bir yıkıcı tasarımına sahiptir. Yıkıcı yöntem, belli bir nesneye başka bir gönderim yoksa veya nesne kapanma sırasında açıkça yok edildiği anda çalıştırılacaktır.

Örnek 3 - Yıkıcı Örneği

<?php
class YıkıcıSınıf
{
   function 
__construct()
   {
       print 
"Kurucu çalıştı\n";
   }

   function 
__destruct()
   {
       print 
"" __CLASS__ " yok ediliyor\n";
   }
}

$obj = new YıkıcıSınıf();
?>

Kurucularda olduğu gibi ebeveyn yıkıcılar çocuk sınıflar için dolaylı olarak çağrılmayacaktır. Ebeveyn sınıfın yıkıcısının çalışması için çocuk sınıfın yıkıcısından parent::__destruct() çağrısının yapılması gerekir. Ayrıca, kuruculardaki gibi, bir çocuk sınıf kendisininkini gerçeklemediyse ebeveyninin yıkıcısını miras alabilir.

Betiğin icrası exit() kullanılarak durdurulsa bile yıkıcı çağrılacaktır. exit() işlevinin bir yıkıcı içersinde çağrılması kalan kapanma yordamlarının icrasını engelleyecektir.

Bilginize:

Yıkıcılar, HTTP başlıklarının gönderilmiş olmasını sağlamak için betik sonlanırken çağrılırlar. Betiğin kapanma aşamasındaki çalışma dizini bazı SAPI’lerde (Apache gibi) farklı olabilir.

Bilginize:

Bir yıkıcı içinden bir istisna oluşturmaya çalışmak (betiğin sonlandırılması sırasında) ölümcül hata ile sonuçlanır.