Как автоматически загружать файлы с помощью zend framework, например, пространства имен

Я разрабатываю новое приложение с нуля, и мне нужно рекурсивно автоматически загружать файлы. Однако мне нужно использовать пространство имен, такое как Zend Framework.

Например, LibraryName_Http_Request загрузит LibraryName/Http/Request.php файл. Что бы я ни пробовал, я могу использовать класс LibraryName_Http_Request только в том случае, если назову файл LibraryName_Http_Request.php.

Я не могу понять, как изменить свой код, чтобы я мог загружать файлы классов в том же стиле Zend...

Вот мой код:

class Autoloader
{

    public function __construct()
    {
        spl_autoload_register( array( $this, 'autoload' ) );
    }

    public function autoload( $class )
    {
        $iterator = new RecursiveDirectoryIterator( LIBRARY_PATH );

        foreach( new RecursiveIteratorIterator( $iterator ) as $file=>$meta ) {

            if( ( $class . '.php' ) === $meta->getFileName() ) {

                if( file_exists( $file ) ) {
                    require_once $file;
                }
                break;
            }
        }        

        unset( $iterator, $file );
    }

}

person Gilberto Albino    schedule 10.09.2012    source источник
comment
В какой-то момент вам нужно будет заменить символы подчеркивания разделителем каталогов.   -  person Mike B    schedule 10.09.2012
comment
Почему вы не хотите использовать Zend_Loader_Autoloader и регистрировать нужные вам пространства имен?   -  person b.b3rn4rd    schedule 12.09.2012
comment
b.b3rn4rd - Я не могу использовать никакую другую библиотеку в проекте! @Mike B - я много раз пробовал заменить файл, но ничего не помогло!   -  person Gilberto Albino    schedule 12.09.2012
comment
Вы можете использовать систему автозагрузчика, поставляемую с Composer, она легкая, и вы можете уменьшить ее до двух файлов для своих нужд.   -  person Maks3w    schedule 12.09.2012
comment
Я обновил свой ответ. Соответствует ли это вашим потребностям?   -  person Florent    schedule 13.09.2012


Ответы (1)


Вы должны проверить PSR-0 который делает то, что вы хотите. Вы можете найти ссылку на реализация загрузчика PSR-0 в конце рекомендации.


Обновление: поскольку вы используете PHP 5.2, приведенный выше загрузчик не полностью соответствует вашим потребностям. Вот простой автозагрузчик, который я написал на основе PSR-0 без поддержки пространства имен:

class SimpleClassLoader
{
    /**
     * Installs this class loader on the SPL autoload stack.
     */
    public function register()
    {
        spl_autoload_register(array($this, 'loadClass'));
    }

    /**
     * Uninstalls this class loader from the SPL autoloader stack.
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));
    }

    /**
     * Loads the given class or interface.
     *
     * @param string $className The name of the class to load.
     * @return void
     */
    public function loadClass($className)
    {
        require str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    }
}

Затем зарегистрируйте загрузчик:

$loader = new SimpleClassLoader();
$loader->register();

Теперь ссылка на LibraryName_Http_Request будет включать LibraryName/Http/Request.php.

person Florent    schedule 10.09.2012
comment
Я удалил свой ответ - этот лучше и содержит больше новых рекомендаций. - person MazB; 10.09.2012
comment
PSR-0 - это полная ерунда. blog.ircmaxell.com/ 2011/11/ - person GordonM; 10.09.2012
comment
@GordonM Я с тобой не согласен. Я был бы рад прочитать ваше мнение, а не мнение Энтони Феррары. Да, PSR-0 не идеален, но в сочетании с автозагрузчиком карты классов вы можете загружать почти каждый класс из любого PHP-проекта. Если вам не нравится мой ответ, не стесняйтесь опубликовать свой. Скажите, если я ошибаюсь, но (ваш фреймворк) автозагрузчик reefknot совместим с PSR-0, верно? - person Florent; 10.09.2012
comment
@Florent Организация классов в файловой структуре похожа на PSR-0 (и, вероятно, она будет хорошо работать с загрузчиком PSR-0), но способ организации классов в PSR-0 не проблема, это разумная схема. . Проблема в том, что он пытается сделать слишком много и не обрабатывает пограничные случаи должным образом (как заявил Энтони), и он, конечно, не должен выдавать ошибку, потому что не может загрузить класс! Мой автозагрузчик вообще не настроен на обработку пространства имен _ по умолчанию (хотя вы можете настроить его экземпляр для его обработки). - person GordonM; 10.09.2012
comment
@Florent Я не использую PHP 5.3 ... и застрял в PHP 5.2, поэтому я создал класс, опубликованный выше. Я уже использую реализацию загрузчика PSR-0, но сейчас она мне не поможет! - person Gilberto Albino; 10.09.2012
comment
Теперь автозагрузчик совместим с PHP 5.2. - person Florent; 12.09.2012