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.
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
}
}
?>
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.