Özdevinimli Sınıf Yükleme

Nesne-yönelimli uygulama yazan birçok geliştirici, her bir sınıf tanımı için ayrı bir PHP kaynak dosyası oluşturmaktadır. Bu kullanımın en can sıkıcı noktalarından bir tanesi, betiklerin en tepesinde bir sürü dosyanın betiğe dahil edilmesini gerektirmesidir (her bir sınıf için ayrı bir dosya).

PHP 5 ile birlikte bu durum zorunluluk olmaktan çıkmıştır. spl_autoload_register() işlevi, henüz tanımlanmamışlarsa, sınıfların ve arayüzlerin özdevinimli olarak yüklenmesini sağlayacak sayıda özdevinimli yükleyiciyi kaydeder. Özdevinimli yükleyicileri kaydederek, bir hatayla başarısızlığa uğramadan önce PHP'ye sınıf veya arayüzü yüklemek için son bir şans verilir.

İpucu

__autoload() işlevi sınıf ve arayüzlerin özdevinimli yüklenmesini sağlasa da spl_autoload_register() işlevini kullanımı tercih edilmelidir. Bunun sebebi daha esnek olmasıdır (üçüncü parti kütüphanelerde olduğu gibi uygulamada belirtilebilecek sayıda özdevinimli yükleyiciyi etkinleştirerek). Bu nedenle __autoload() işlevinin kullanılmaması daha iyi olur ve hatta, ileride kullanımı önerilmeyen işlev durumuna da gelebilir.

Bilginize:

5.3.0 öncesinde, __autoload işlevinde oluşan istisnalar catch bloğu ile yakalanamaz, dolayısıyla ölümcül hata ile sonuçlanır. 5.3.0 ve sonrasında ise, özel bir istisna yakalanacaksa özel istisna sınıfının mevcut olmasıyla bu mümkündür. __autoload işlevi özel istisna sınıflarını iç içe yüklemek için kullanılabilir.

Bilginize:

PHP CLI'yi etkileşimli kipte kullanıyorsanız özdevinimli yükleme kullanılamayacaktır.

Bilginize:

Sınıf ismini call_user_func() gibi bir işlevde kullanırsanız ../ gibi bazı tehlikeli karakterler içerebilir. Böyle işlevlerde kullanıcı girdilerini kullanmamanız ya da en azından girdiyi __autoload() ile doğrulamanızı öneririz.

Örnek 1 - Özdevinimli yükleme örneği

Bu örnek MyClass1 ve MyClass2 sınıflarını yüklemeye çalışmaktadır. Sınıflar aynı isimli MyClass1.php ve MyClass2.php dosyalarının içinde yer almaktadırlar.

<?php
spl_autoload_register
(function ($class_name) {
    include 
$class_name '.php';
});


$obj  = new MyClass1();
$obj2 = new MyClass2();
?>

Örnek 2 - Başka bir özdevinimli yükleme örneği

Bu örnek DenemeA arayüzünü yüklemeye çalışır.

<?php

spl_autoload_register
(function ($name) {
    
var_dump($isim);
});

class 
Fan implements DenemeA {
}

/*
string(5) "DenemeA"

Fatal error: Interface 'DenemeA' not found in ...
*/
?>

Örnek 3 - 5.3.0 ve sonrasında istisnalı özdevinimli yükleme

Bu örnekte bir istisna yakalanmakta ve try/catch kullanımı gösterilmektedir.

<?php
spl_autoload_register
(function ($name) {
    echo 
"$name yüklenmek isteniyor.\n";
    throw new 
Exception("$name yüklenemedi.");
});

try {
    
$obj = new YüklenemezSınıf();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
?>

Yukarıdaki örneğin çıktısı:

YüklenemezSınıf yüklenmek isteniyor.
YüklenemezSınıf yüklenemedi.

Örnek 4 5.3.0+ için istisnalı özdevinimli yükleme - Eksik özel istisna

Bu örnek, yüklenemeyen, özel bir istisna için bir istisna yavrular.

<?php
spl_autoload_register
(function ($name) {
    echo 
"$name yüklenmek isteniyor.\n";
    throw new 
Eksikİstisna("$name yüklenemedi.");
});

try {
    
$obj = new YülenemezSınıf();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
?>

Yukarıdaki örneğin çıktısı:

YülenemezSınıf yüklenmek isteniyor.
Eksikİstisna yüklenmek isteniyor.

Fatal error: Class 'Eksikİstisna' not found in testMissingException.php on line 4