Будет ли каталог с разрешением автозагрузки прерывать точку на основе пространства имен в Zend Framework?

У меня есть папка в папке моей библиотеки, которая названа в честь моего сайта. Путь к папке выглядит так:

~ \ WWW \ Библиотека \ myWebsite.com

Если я использую автозагрузчик Zend для загрузки пространства имен всего в пути к библиотеке, у меня возникнут проблемы с автозагрузкой класса из этого файла с таким пространством имен:

\ MyWebsite.com \ MyClass:: туРипсЫоп ();

Я посмотрел в Интернете документацию по этому вопросу, и я не могу найти информацию об использовании периодов таким образом.

2 ответа

Решение

Я попробовал это, и сложность в PHP. Я думаю, что Zend хорошо регистрирует пространство имен, потому что когда я вызываю \Zend_Load_Autoloader::getRegisteredNamespaces(), это показывает, что оно зарегистрировано. но когда я вызываю статический метод из полностью определенного пространства имен, php выдает ошибку этого:

Fatal error: Undefined constant 'myWebsite' in /home/jesse/www/application/controllers/MyController.php on line 15 

Похоже, что PHP завершает идентификатор пространства имен во время синтаксического анализа в. (символ периода). Это разочаровывает, потому что для меня наличие библиотеки, названной в честь веб-сайта, было важно для моего дизайна.

Я переименую каталог в myWebsitecom или, возможно, сделаю.com его собственным подкаталогом, например

myWebsite\com и включите его в мое дерево имен, например: \MyNamespace\Com\MyClass::myFunction();

Самый простой способ узнать это - попробовать.

Если это не работает, вы всегда можете написать собственный автозагрузчик, чтобы он работал. У меня нет большого опыта работы с пространствами имен php, но автозагрузчик будет выглядеть примерно так (я полагаю, вам придется немного поработать с ним, чтобы определить правильный путь к файлу с учетом имени класса):

<?php
class My_Loader_Autoloader_MyWebsite implements Zend_Loader_Autoloader_Interface {

    /**
     * (non-PHPdoc)
     * @see Zend_Loader_Autoloader_Interface::autoload()
     */
    public function autoload($class) {

        if (strtolower(substr($class, 0, 9)) == 'mywebsite') {
            $file = realpath(APPLICATION_PATH . '/../library/myWebsite.com/' . $class);
            if ($file) {
                require_once $file;
                return $class;
            }
        }
        return false;
    }
}

затем поместите это в свой загрузчик:

$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->pushAutoloader(new My_Loader_Autoloader_MyWebsite());

и если этот класс должен находиться в этом каталоге myWebsite.com, вы можете просто обмануть и добавить туда требование:

 require_once(APPLICATION_PATH . '/../library/myWebsite.com/Loader/Autoloader/MyWebsite.php');
Другие вопросы по тегам