SPL autoloading iyi uygulamalar

2 Cevap php

Sunucu tarafında benim include_path I '/ usr / share / armut /' de, bir armut dizine bir başvuru var. Benim uygulamaları içinde ben require_once 'library/file.php' ile '/ usr / share / armut / library /' yaşayan ortak bir kütüphane dosyaları içerir.

Geçenlerde spl autoloader kullanmaya başladıktan sonra, ben dosyayı eklemek için hangi ile mantığını belirlemek zorunda yükleyici fonksiyonunda fark ettim. Bunu yapmanın ilk yolu, örneğin, başarısız olsaydı @ görmek için bir dosya eklemek için çalışıyor ve bunu bastırmak edildi @include 'library/file.php' ancak ben @ (I {[tarafından get_include_path patlayan elle esere kendim yapmaya karar kötü bir uygulama olmakla ilgili bir şey okumak çoğunlukla çünkü düşünüyorum 4)]} ve dizin ben o zaman bir file_exists yapıyor ve onu dahil olmak istiyorum ne olup olmadığını görerek.

Şöyle:

function classLoader( $class ) {
    $paths = explode( PATH_SEPARATOR, get_include_path() );
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
    if ( file_exists( $file) == false ) 
    {
    	$exists = false;
    	foreach ( $paths as $path ) 
    	{
    		$tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php';
    		if ( file_exists ( $tmp ) ) 
    		{
    		$exists = true;
    		$file = $tmp;
    		}
    	}
    	if ( !$exists ) { return false; }
    }
    include $file;
}

spl_autoload_register('classLoader');

Ben yanlış yol gitmek mi? Ben sadece @include iş yapmış mıyım yoksa doğru yönde biraz bunu yapıyorum?

2 Cevap

Habari project autoloader bu ilginç gelmez bir şey bellekte bütün sınıf dosya listesi önbellek böylece dosyaları için bir sınıf istenen her zaman bir disk arama yapmıyor.

Esasen, bunları yüklemek için neden olacaktır sınıfı tarafından endeksli sınıf dosyaları bir dizi tutar sizin __autoload() içinde bir statik beyan. Örneğin, kod Dir kullanmak istiyorsunuz veya glob() Bu statik bir dizi oluşturmak için:

$class_files = array(
  'user' => '/var/www/htdocs/system/classes/user.class.php',
);

Sonra sadece include $class_files[$class] doğru dosyayı almak için. Oldukça listesi oluşturma veya belirli bir dosya için yeni bir sınıf başvurulan her zaman aramak yerine, tek seferde diskten katalog alır, çünkü bu güzel ve hızlı olduğunu. (Bunu yapan ne kadar bir hız farkı sürpriz olurdu.)

Sınıf adı dizideki bir anahtar yoksa, özel bir istisna ya da geri dönmek için bir saplama / sahte sınıfını oluşturabilir. Eğer Habari sistem autoloader kontrol eğer Ayrıca, statik sınıflar için bir yapıcı gibi, hangi Habari uygular __static() sınıflarında özdevinimli olduğunu görürsünüz.

include_once() kaçınılması gereken bir durumdur, ve eklemek dosya için kontrol ettik @ operatörü gereksizdir.

Ben şahsen kullanarak yol

function autoload($class) {
    /* transform class name into filename ... */
    include $class;
}

Hatta hata ayıklama kolaylaştırmak için @ olmadan (hatalar kapatılır / üretim giriş)

Ayrıca PHP geliştiricisi listesinde ilgili tartışma ilginizi çekebilir: http://marc.info/?t=125787162200003&r=1&w=2