2009-11-11 4 views
5

В моем include_path на стороне сервера у меня есть ссылка на каталог груши в '/ usr/share/pear /'. В моих приложениях я включаю файлы из общей библиотеки, живущие в '/ usr/share/pear/library /' с require_once 'library/file.php'.SPL Автозагрузка лучших практик

Я недавно начал использовать автозагрузчик spl, я заметил, что в функции загрузчика вы должны определить логику, с помощью которой можно включить файл. Мой первый способ сделать это - попытаться включить файл и подавить его с помощью @, чтобы узнать, не сработает ли он, например. @include 'library/file.php' Однако я думаю, что в основном потому, что я много читал о @, будучи плохой практикой, я решил вручную выполнить эту работу самостоятельно, взорвав get_include_pathPATH_SEPARATOR и посмотрев, является ли каталог тем, чем я хочу быть, а затем делает file_exists и в том числе ,

Как так:

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

ли я пойти неправильный путь? Должен ли я просто сделать бизнес @include, или я делаю это несколько в правильном направлении?

ответ

6

По существу, вы объявляете статическую информацию в своем __autoload(), которая содержит массив всех файлов классов, индексированных классом, который заставит их загружать. Например, код будет использовать Dir или glob(), чтобы создать этот статический массив:

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

Тогда вы просто включить $class_files[$class], чтобы получить правильный файл. Это хорошо и быстро, потому что он сразу же получает каталог с диска, а не генерирует список или ищет определенное имя файла при каждом обращении к новому классу. (Вы были бы удивлены, какая разница в скорости.)

Если имя класса не является ключом в массиве, вы можете создать собственное исключение или создать возвращаемый класс заглушки/макета. Кроме того, если вы заберете автозагрузчик системы Habari, вы увидите, что Habari реализует __static() в классах, которые автоматически загружаются, что похоже на конструктор для статических классов.

include_once() следует избегать, а оператор @ не нужен, если вы проверили, какой файл следует включить.

1

Я лично пройти путь, используя

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

даже без @, чтобы облегчить отладку (ошибки закрыты/вошли в систему производства)

Вы также можете быть заинтересованы в соответствующей дискуссии на PHP разработчик: http://marc.info/?t=125787162200003&r=1&w=2

+3

Не является ли автозагрузчик более практичным и современным методом? Или это в основном одно и то же? –