2009-11-11 17 views
5

W mojej include_path po stronie serwera mam odniesienie do katalogu gruszki, w '/ usr/share/pear /'. Do moich aplikacji dołączam pliki ze wspólnej biblioteki, z "/ usr/share/pear/library /" z require_once 'library/file.php'.SPL Autoloading best practices

Niedawno zacząłem używać autoloadera spl, zauważyłem w funkcji programu ładującego, aby określić logikę, z którą należy dołączyć plik. Moim pierwszym sposobem było to, aby dołączyć plik i wyłączyć go za pomocą @, aby sprawdzić, czy nie zawiedzie, np. @include 'library/file.php' jednak myślę, że głównie dlatego, że dużo czytałem o @ będąc złym treningiem postanowiłem ręcznie wykonać pracę samodzielnie eksplodując get_include_path przez PATH_SEPARATOR i sprawdzając, czy katalog jest tym, czym chcę, a następnie wykonując file_exists i włączając go .

tak:

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'); 

Czy idę złą drogę? Czy powinienem zrobić interes w sprawie @include, czy też robię to w pewnym sensie?

Odpowiedz

6

Interesująca jest funkcja Habari project autoloader, która buforuje całą listę plików klas w pamięci, aby nie wyszukiwała plików za każdym razem, gdy klasa jest żądana.

Zasadniczo deklarujesz wewnątrz swojego __autoload() statyczną tablicę zawierającą wszystkie pliki klas, indeksowane przez klasę, która spowoduje ich załadowanie. Na przykład, kod użyłby Dir lub glob() do wygenerowania tego statycznej tablicy:

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

Wtedy po prostu to $class_files[$class] aby uzyskać właściwy plik. Jest to ładne i szybkie, ponieważ pobiera katalog z dysku naraz, zamiast generować listę lub wyszukiwać określoną nazwę pliku za każdym razem, gdy przywoływana jest nowa klasa. (Byłbyś zaskoczony, jak duża jest różnica prędkości.)

Jeśli nazwa klasy nie jest kluczem w tablicy, możesz rzucić niestandardowy wyjątek lub wygenerować klasę stub/mock, aby powrócić. Ponadto, jeśli wypróbujesz automatyczny mechanizm ładujący Habari, zobaczysz, że Habari implementuje __static() w klasach, które są ładowane automatycznie, co jest jak konstruktor klas statycznych. Należy unikać unikania jednego operatora:

include_once(), jeśli operator nie sprawdza, czy plik ma być dołączony.

1

osobiście przejść drogę korzystając

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

nawet bez @ ułatwienia debugowania (błędy są zamknięte/zalogowany produkcji)

Możesz być także zainteresowany powiązanego dyskusji na PHP lista deweloperów: http://marc.info/?t=125787162200003&r=1&w=2

+3

Czy spl autoloading nie jest bardziej praktyczną i nowoczesną metodą? Czy to w zasadzie to samo? –

Powiązane problemy