Nasıl autoload sınıfları genişletilmiş?

3 Cevap php

Ben dynamicly yalnızca gerekli sınıf dosyaları yüklemek için PHP'nin özdevinimli_yükle işlevini kullanmayı planlıyorum. Şimdi sınıflar 1. sınıf dosyasında kalır ve otomatik yüklü olması ile ilgili olduğu bir yol var her bir fonksiyon ayrı bir dosya varsa, bu büyük bir karmaşa yaratabilir, Bu yüzden umut ve soruyorum

function __autoload($class_name){
    include('classes/' . $class_name . '.class.php');
}

Köpekleri adında bir sınıf adı hayvanlar ve daha sonra başka bir sınıf var diyelim. Köpekler sınıf I köpekler sınıf diyorlar ama hayvanlar sınıf aramak değil vardı şimdi ise, hayvanlar sınıf dosyası hala yüklenmiş olacaktır, hayvanlar sınıfını genişletir?

3 Cevap

if I were to call the dogs class but NOT call the animals class, would the animals class file still be loaded?

Evet. Eğer başka bir sınıfını genişleten bir sınıf yüklediğinizde o uzanan ne bilir böylece, PHP temel sınıf yüklemeniz gerekir.

re: Dosya başına birden fazla sınıflar depolama fikri: Bu sağlanan özdevinimli_yükle fonksiyonu ile çalışmaz. Dosya başına bir sınıf özellikle özdevinimli sınıflar için gerçekten iyi uygulamadır.

Bir dosyada birden fazla sınıf varsa, gerçekten autoload bu dosyanın herhangi sınıfları teşebbüs edilmemelidir.

Eğer sınıf konumlarının açık tanımlarını düşündünüz mü? Bazen ilişkili sınıflar için anlamda bir çok yapar.

İşte ele kanıtlanmış bir yoludur.

Bu kod yerleştirilen bir auto_prepend_file (veya ilk dahil)

class Import
{
    public static $_AutoLoad = array();
    public static $_Imported = array();

    public static function Load($sName)
    {
        if(! isset(self::$_AutoLoad[$sName]))
            throw new ImportError("Cannot import module with name '$sName'.");

        if(! isset(self::$_Imported[$sName]))
        {
            self::$_Imported[$sName] = True;
            require(self::$_AutoLoad[$sName]);
        }
    }

    public static function Push($sName, $sPath)
    {
        self::$_AutoLoad[$sName] = $sPath;
    }

    public static function Auto()
    {
        function __autoload($sClass)
        {
            Import::Load($sClass);
        }
    }
}

Ve önyükleme dosyası, sınıfları tanımlamak ve onlar içeri ne dosyası

//Define autoload items
Import::Push('Admin_Layout',        App::$Path . '/PHP/Admin_Layout.php');
Import::Push('Admin_Layout_Dialog', App::$Path . '/PHP/Admin_Layout.php');
Import::Push('FileClient',          App::$Path . '/PHP/FileClient.php');

Ve son olarak, arayarak AutoLoad etkinleştirin

Import::Auto()


Güzel şeylerden biri "Modülleri" tanımlayabilirsiniz ki:

Import::Push('MyModule',          App::$Path . '/Module/MyModule/Init.php');

Gerektiğinde Ve sonra açıkça onlara yük:

Import::Load('MyModule');

Ve en iyi parçalarından biri size zamanında kendi sınıflarının tüm tanımlayacak modülünde ek Import::Push hatları, sahip olabilirsiniz.

Eğer dahil değil sürece evet yükleyecektir / sınıf dosyası gerektirir.

Her zaman gerekli PHP kodu içeren herhangi bir dosya almak zorunda. PHP kendisi sınıf dosyasına verdiği isim tahmin edemez. Örneğin Java aksine, PHP sınıfları adlandırma gereksinimleri herhangi bir dosya yok.

Bu sorunu çözmek yaygın bir şekilde tek bir dosya ilişkili sınıflar için. Bir "modül" oluşturma.