Как организовать совместное использование __autoload и namespace?

Насколько понимаю, с появлением пространств имён, использование имён классов с нижними подчеркиваниями (class Module_ClassName) стало ненужным. И теперь вполне логичным было бы использование автоподгрузки классов в зависимости от используемого им пространства имён. То есть, для примера, нужный класс у нас лежит в каталоге /classes/Module/ClassName.class.php и в этом скрипте прописано пространство имён:

namespace Module;

Когда мы вызываем класс в скрипте, использующем глобальное пространство имён, мы пишем:

$foo = new Module/ClassName;

Тогда в данном клиентском коде можно использовать автозагрузчик следующего вида:

function __autoload($class)
{
    require_once '/classes/'.$class.'.class.php';
}


По-моему, всё предельно просто. И мне кажется, что именно для этого предназначались пространства имён.

Но вот что делать, когда класс вызывается не из глобального пространства имён? Чтобы каким-то хитромудрым способом модифицировать загрузчик, чтобы он определял текущее пространство имён во время вызова и подставлял его в путь... Но вот проблема: объявление namespace почему-то убивает функцию __autoload (она просто не выполняется).

В общем, интересно, как можно организовать совместную работу пространств имён и автозагрузчика, чтобы:

1. Не использовать в скриптах бесконечные require для классов.
2. Не модифицровать include path.
3. Хранить все классы в одной папке classes, в подпапках соответствующих модулям.

В различных источниках (книгах, уроках, стандартах вроде PEAR) - полный разюрод и шатание, т. к. половина еще тащится за поддержкой старого кода без namespace. Я же планирую писать для себя, только под новые версии.

P. S. Задача состоит в в том, чтобы решить задачу без подключения сторонних библиотек/менеджеров и т. п.
  • Вопрос задан
  • 402 просмотра
Решения вопроса 1
Audiophile
@Audiophile Автор вопроса
Всё, заработало. Надо было просто поместить автозагрузчик в глобальное пространство. Вынес его в отдельный файл:

namespace {
    function __autoload($class)
    {
        require_once str_replace("/", DIRECTORY_SEPARATOR, $_SERVER['DOCUMENT_ROOT'])
                                    .DIRECTORY_SEPARATOR
                                    .'classes'
                                    .DIRECTORY_SEPARATOR
                                    .$class.'.class.php';
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Используйте composer, он будет все скучные вещи делать за вас.
Ответ написан
@taurus90
Пространства имен используются как пространства имен, и ничего больше. Дословно, namespace позволяет использовать классы с одинаковыми именами без проблем (что может произойти при использовании чужых разработок).
После подгрузки PHP скрипта, возможно, стоит использовать ключевое слово use.

Боги расскажут.
Ответ написан
He11ion
@He11ion
PHP-monkey
Есть чудные буковки, которые должен знать каждый, считающий себя php-программистом: PSR. В PSR-4 как раз и формулируется принципы работы автозагрузки. Их и реализует composer, кстати.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы