SPL autoloader İstisnalar Fırlatma?

2 Cevap php

Başarısız durumda PHP bir SPL Yükleyici'ye istisnalar atmak için bir yolu var mı? PHP 5.2.11 altında çalışmak için görünmüyor.

class SPLAutoLoader{

    public static function autoloadDomain($className) {
        if(file_exists('test/'.$className.'.class.php')){
            require_once('test/'.$className.'.class.php');
            return true;
        }       

        throw new Exception('File not found');
    }

} //end class

//start
spl_autoload_register( array('SPLAutoLoader', 'autoloadDomain') );

try{
    $domain = new foobarDomain();
}catch(Exception $c){
    echo 'File not found';
}

Yukarıdaki kod çağrıldığında, bir istisna hiçbir işaret yerine bir standart olsun, var "Ölümcül hata: Sınıf 'foobarDomain' bla bulunamadı". Ve script yürütme sonlandırır.

2 Cevap

Bu bu, bir hata değildir a design decision:

Note: __autoload fonksiyonu atılmış İstisnalar bir ölümcül hata catch bloğu ve sonuçları yakalanmış olamaz.

Sebebi var, birden fazla özdevinimli_yükle işlemcileri olabilir, bu durumda bir istisna atmak için ilk işleyici istemiyorum ve ikinci işleyicisi bypass olmasıdır. Eğer ikinci işleyici sınıflarına hakklı bir şans istiyorum. Eğer autoloading özelliğinin kullanımını yapan bir kütüphane kullanıyorsanız, onların autoloader içinde İstisnalar atmak çünkü sizin özdevinimli_yükle işleyicisi atlayarak istemiyorum.

Eğer bir sınıf örneğini olup olmadığını kontrol etmek istiyorsanız, o zaman class_exists and pass true ikinci argüman olarak kullanmak (veya dışarı bırakın, true varsayılan )

if (class_exists('foobarDomain', $autoload = true)) {
    $domain = new foobarDomain();
} else {
    echo 'Class not found';
}

the documentation for spl_autoload_register olarak yorumlarına göre, bu da istisna hangi, robotun başka bir işlevi çağırmak mümkündür.

class SPLAutoLoader{

    public static function autoloadDomain($className) {
        if(file_exists('test/'.$className.'.class.php')){
            require_once('test/'.$className.'.class.php');
            return true;
        }       
        self::throwFileNotFoundException();
    }

    public static function throwFileNotFoundException()
    {
        throw new Exception('File not found');
    }

} //end class

//start
spl_autoload_register( array('SPLAutoLoader', 'autoloadDomain') );

try{
    $domain = new foobarDomain();
}catch(Exception $c){
    echo 'File not found';
}