2013-06-30 3 views
0

Это мой текущий автозагрузчика:PHP Autoload классы с каталогами?

function classAutoLoad($class) { 
    if (file_exists($_SERVER['DOCUMENT_ROOT']."/framework/includes/class/$class.class.php")) 
     include($_SERVER['DOCUMENT_ROOT']."/framework/includes/class/".$class.".class.php"); 
} 

spl_autoload_register('classAutoload'); 

Использование:

$class = new Classname; 

В основном это будет загружать все классы внутри/класс /, не включая каталоги. Что я пытаюсь сделать, будь чище.

У меня много классов, и я хочу упаковать их в каталоги.

Как включить поддержку пакетов здесь? Или есть популярная библиотека для этого?

+0

[загрузчик классов Symfony] (https://github.com/symfony/ClassLoader), например, загружает классы, используя соглашение об именах ['PSR-0'] (https://github.com/php-fig /fig-standards/blob/master/accepted/PSR-0.md) (есть и другие, соглашение об именах, вероятно, самое главное здесь). – Wrikken

ответ

1

Вам необходимо придумать способ сопоставления имен классов файлам. Вы можете сделать это явно, поддерживая ассоциативный массив, или вы можете использовать какое-то соглашение, например PSR-0. PSR-0 указывает, что пространства имен должны переводить в каталоги в $class, которые передаются вашему автозагрузчику, поэтому вы можете заменить разделитель пространства имен \ разделителем каталогов вашей системы.

0

Ваш код кажется более приличным для того, что вы пытаетесь сделать, загружая в один конкретный каталог. Однако я бы изменил if (file_exists(...)) { ... }, чтобы вызвать ошибку, если файл не существует. Что-то вроде

if (file_exists(...)) { 
    ... 
} else { 
    throw new RuntimeException($class . ' could not be found.'); 
} 

Вы посмотрите на Loader.php, который является сценарием заряжания, который я использую можете. Это учитывает пространства имен и может быть изменено только для просмотра *.class.php.

Чтобы использовать его:

require_once($_SERVER['DOCUMENT_ROOT']."/path/to/Utilities/Loader.php"); 
\Utilities\Loader::register(); 

$class = \Namespace\ClassName(); 
0

Если автозагрузчик не должен быть полностью динамическим, вы можете использовать simly PHP Autoload Builder. Она сканирует весь каталог и автоматически создает отображение статического класса к-файла, который выглядит примерно так:

spl_autoload_register(function($class) { 
    static $classes = null; 
    if ($classes === null) { 
     $classes = array(
      'my\\first\\class' => 'My/First/Class.php', 
      'my\\secondclass' => 'My/SecondClass.php' 
     ); 
    } 
    $cn = strtolower($class); 
    if (isset($classes[$cn])) { 
     require __DIR__ . $classes[$cn]; 
    } 
}); 

Плюсы:

  • Быстрый и надежный
  • Гибкость (в принципе, вы можете использовать любое именование вам нравится)

Минусы:

  • Необходимо выполнять повторный запуск при каждом добавлении, удалении или переименовании классов.
Смежные вопросы