PHP çoklu __ özdevinimli_yükle fonksiyonları * olmadan spl_register_autoload kullanımı?

3 Cevap php

Ben bir PHP büyüyen bir kütüphane yazarı + QuickBooks ilgili kod değilim. () Zaten tanımlı değil varlık ben kendi uygulamalarına) (__ autoload () fonksiyonu, however kodumu diğer insanların içerebilir bir kütüphanedir Phps kullanmak istiyorum, bu yüzden __ autoload güvenemez .

Birden __ özdevinimli_yükle () işlevleri için bir yolu var mı?

Ben PHP kılavuzda spl_autoload_register () but değil tüm kullanıcıların SPL uzantısı yüklü gördüm, bu yüzden ben bu güvenemez. Bu kullanarak geri düşmek gerektiren ve / varsayılan ifadeleri içeren normal kullanmak için bir yolu olsaydı, ben o düşünebilirsiniz.

Başkasının bu konuda herhangi bir başka akıllı çözümler var mı? Sadece tek bir __ autoload () fonksiyonu var edebilmek için göz kamaştırıcı bir gözetim gibi görünüyor ...

3 Cevap

Ben PHP kılavuzunda () spl_autoload_register gördüm, ama benim kullanıcıların tüm SPL uzatma yüklü, bu yüzden ben bu güvenemez.

Onları görmezden varsayılan tarafından derlenmiş ve hatta 5.3.0 devre dışı edilemez. Azınlığı memnun etmek için bir çerçeve kurban etmeyin.

Ben bu konuda gitmek ve aynı zamanda geriye dönük uyumluluğu korumak için yolu kendi "Loader" sınıf yazmak olduğuna karar verdik.

Bunun yerine require_oncenin 'TheFile.php' kullanarak, ben şimdi Loader :: load ('TheFile.php') kullanın;. Yükleyici :: load () yöntemi şunları yapar:

if ( the function spl_autoload_register exists )
   register an autoloader
   return true
else 
   check if the file has already been included (static array var with a list of files)
   if not included yet
      require $file
   return true

Bu bana kendi PHP kurulum bunu destekliyorsa autoloader kullanın, aksi takdirde $ dosya gerektirir sadece normal yapmaya geri düşmek için esneklik sağlar; şeyler yazın.

Sen liste tükenene kadar sınıf bulunamadı veya edilene kadar sadece gerçek sınıf yükleme yapmak geriçağırımlarının bir dizi üzerinde gezinerek bir __ özdevinimli_yükle işlev yazabilirsiniz.

function loader1 ($className)
{
    if (is_file ('foo/' . $clasName))
    {
        include ('foo/' . $className);
        return (true);
    }
}

function loader2 ($className)
{
    if (is_file ('bar/' . $clasName))
    {
        include ('bar/' . $className);
        return (true);
    }
}

function loader3 ($className)
{
    if (is_file ('baz/' . $clasName))
    {
        include ('baz/' . $className);
        return (true);
    }
}

function __autoload ($className)
{
    $autoloaders = array (
        'loader1', 
        'loader2', 
        'loader3'
    );
    foreach ($autoloaders as $loader)
    {
        if ($loader ($className))
        return (true);
    }
    throw new Exception ('Failed to find class ' . $className);
}

NOT: Bu, "manşet kapalı" ben bunu test ettik.