2010-04-13 12 views
7

Ben yaklaşık dinamik okumak böyle bir işlevi gerektiğinde Sınıf dosyalarınızı yüklerken adres:PHP'nin __autoload işlevi yerine mi geçiyorsunuz?

function __autoload($className) 
{ 
    include("classes/$className.class.php"); 
} 

$obj = new DB(); 

o sınıfın yeni bir örneğini yaptığınızda otomatik olarak DB.class.php yükleyecektir, ama ben de bir kaç makalelerde okumanız Bunu global bir işlev olarak kullanmak kötüdür ve projenize getirdiğiniz tüm kütüphaneler __autoload() işlevine sahip olacaktır.

Herkes bir çözümü biliyor mu? Belki de __autoload() ile aynı etkiyi elde etmenin başka bir yolu? Uygun bir çözüm bulana kadar, kütüphaneler ve benzerlerini getirene kadar sorun olmaya başlamadığından sadece __autoload()'u kullanmaya devam edeceğim.

Teşekkürler.

cevap

10

: Bazı 3. taraf siz de autoloader-yığın o fonksiyonu koyabilirsiniz tanıtılan bir __autoload fonksiyonunu kaydetmek için içermemeli ve ayrıca, eklemeniz gereken __autoload kullanan kütüphaneleri de kullanmalısınız.

//check to see if there is an existing __autoload function from another library 
if(!function_exists('__autoload')) { 
    if(function_exists('spl_autoload_register')) { 
     //we have SPL, so register the autoload function 
     spl_autoload_register('my_autoload_function');  
    } else { 
     //if there isn't, we don't need to worry about using the stack, 
     //we can just register our own autoloader 
     function __autoload($class_name) { 
      my_autoload_function($class_name); 
     } 
    } 

} else { 
    //ok, so there is an existing __autoload function, we need to use a stack 
    //if SPL is installed, we can use spl_autoload_register, 
    //if there isn't, then we can't do anything about it, and 
    //will have to die 
    if(function_exists('spl_autoload_register')) { 
     //we have SPL, so register both the 
     //original __autoload from the external app, 
     //because the original will get overwritten by the stack, 
     //plus our own 
     spl_autoload_register('__autoload'); 
     spl_autoload_register('my_autoload_function');  
    } else { 
     exit; 
    } 

} 

Yani, bu kod varolan __autoload fonksiyonu için kontrol edecek ve (spl_autoload_register Normal __autoload davranışını devre dışı bırakan çünkü) kendi hem de yığın ekleyin.

+0

A İyi bir çözüm, ancak spl_autoload kullanarak, sadece varolan autoload ile alakasız bir şekilde küçük değişiklikler yapmam gerekiyorsa, eğer varsa sadece __autoload işlevini spl yükleyin, sonra işlevinizi spl yükleyin. – Aatch

+0

Evet, bunu doğru anlayabilsem de, gerçekten de bununla ilgili ifadeler varsa, sadece etkin bir şekilde değiştiriyorsun. – Kazar

3

__autoload yerine spl_autoload_register kullanın. Bu, otomatik yükleme işlevinizi yığına eklemenizi sağlar.

+0

'spl_autoload_register' varolan herhangi' __autoload' işlevi clobbers, bu nedenle bir kütüphane kullanır, sen kütüphanenin fonksiyonunu ortadan kaldırmak. İki kütüphanenin her ikisi de bir '__autoload' fonksiyonunu tanımlasa bile, yine de biraz vidalanmışsınız demektir! –

+0

Kodunuzda mevcut bir __autoload işlevi varsa, bu işlev __autoload yığında açıkça kayıtlı olmalıdır. Bunun nedeni, spl_autoload_register() işlevinin __autoload işlevi için motor önbelleğini etkin olarak spl_autoload() veya spl_autoload_call() ile değiştirmesidir. Bu sayfa manüel sayfadan alınmıştır. – Ololo

0

Zend_Loader'u kullanabilirsiniz. (Zend Framework'ün sizin için mevcut olduğunu farz edelim ...)

6

spl_autoload_register()'u kullanarak mevcut herhangi bir __autoload() sihirbazını yığına ekleyebilirsiniz.

function my_autoload($class) {  
    include($class . '.al.php'); 
} 
spl_autoload_register('my_autoload'); 

if(function_exists('__autoload')) { 
    spl_autoload_register('__autoload'); 
}                       

$f = new Foo; 
4

Doğru yol, spl_autoload_register kullanmak olacaktır. o değil mi eğer bunu parçalama Bir bakıma spl_autoload_register kullanmak için aşağıdaki kodu kullanmış

if (function_exists('__autoload')) { 
    spl_autoload_register('__autoload'); 
} 
0

Programlama yapmakta olduğunuz tüm alt sistemler için otomatik yüklemeden sorumlu kendi nesnesini tanımlayabilirsiniz. Örneğin

:

bence
class BasketAutoloader 
{ 
    static public function register() 
    { 
    spl_autoload_register(array(new self, 'autoload')); 
    } 

    public function autoload($class) 
    { 
    require dirname(__FILE__).'/'.$class.'.php'; 
    } 
} 
İlgili konular