PHP autoloader: görmezden mevcut olmayan dahil

4 Cevap php

Benim autoloader ile ilgili bir sorun var:

public function loadClass($className) {
    $file = str_replace(array('_', '\\'), '/', $className) . '.php';
    include_once $file;
}

Gördüğünüz gibi, bu oldukça basit. Ben sadece sınıfın dosya anlamak ve bunu eklemeyi deneyin. Ama bir sorun var; (Ben istisnalarını atar bir hata işleyicisi var çünkü) Mevcut olmayan bir sınıf yüklemeye çalışırken bir istisna olsun. Olmayan bir mevcut sınıfında class_exists () kullandığınızda da kovuldu çünkü bu, sakıncalıdır. Sen sadece bir "yanlış" döndü, orada bir istisna istemiyorum.

Ben (tüm hataları baskılayarak) eklemek için önce bir @ koyarak bu daha önce sabit. Bu ile büyük dezavantajı olsa da, bu (ölümcül) herhangi bir ayrıştırıcı / derleyici hataları hata bulmak zor sonuçlanan, (hatta günlüklerinde) görünmeyecektir dahil olmasıdır.

Ne seferde hem sorunları çözmek için en iyi yol olacağını? Kolay yolu otomatik yükleyici (yalancı) böyle bir şey eklemek olacaktır:

foreach (path in the include_path) {
    if (is_readable(the path + the class name)) readable = true;
}
if (!readable) return;

Ama orada performansı hakkında endişe. Bir çok zarar vereceğini?


(Çözüldü) bu gibi yapılmıştır:

public function loadClass($className) {

	$file = str_replace(array('_', '\\'), '/', $className) . '.php';	
	$paths = explode(PATH_SEPARATOR, get_include_path());
	foreach ($paths as $path) {
		if (is_readable($path . '/' . $file)) {
                        include_once $file;
                        return;
                    }
	}

}

4 Cevap

Bu sadece bir kez sınıf başına çağırdı alacak, böylece performans bir sorun olmamalı.

 public function loadClass($className) {
     $file = str_replace(array('_', '\\'), '/', $className) . '.php';
     if(is_readable($file))
       include_once $file;
 }

is_readable büyük bir performans farkı yapmaz.

class_exists () ikinci bir parametre vardır autoload, hangi FALSE olarak ayarlandığında, bir nonexistant sınıf için autoloader tetiklemeyecektir.

(Çözüldü) bu gibi yapılmıştır:

public function loadClass($className) {

	$file = str_replace(array('_', '\\'), '/', $className) . '.php';	
	$paths = explode(PATH_SEPARATOR, get_include_path());
	foreach ($paths as $path) {
		if (is_readable($path . '/' . $file)) {
                        include_once $file;
                        return;
                    }
	}

}