Я сделал следующее. Сначала я создал фильтр перехвата, для перехвата всех веб-запросов, я также создал версию, которая будет работать с командами командной строки.
Оба перехватчика будут отправлены в файл загрузочной ленты, который настроит автозагрузчик. Этот файл как функция автозагрузки и хеш. Для хэша ключ - это имя класса, а значение - путь к файлу класса. Функция автозагрузки просто берет имя класса и запускает требование для файла.
Несколько советов по производительности, если они вам нужны, используйте одинарные кавычки при определении файла, так как они немного быстрее, так как они не интерпретируются, также используйте require / include вместо их версий _once, это гарантированно работает один раз, а первый немного быстрее.
Вышеприведенное замечательно, на самом деле, даже с большой базой кода и множеством классов, хеш не такой большой, а производительность никогда не была проблемой. И что еще более важно, мы не женаты на каком-то сумасшедшем соглашении об именовании классов пространства псевдо-имен, см. Ниже.
Другой вариант - имя с разделителями, трюк с псевдо-пространством имен. Это менее привлекательно, так как пространства имен будут поставляться с 5.3, и я считаю, что это грубо, поскольку переименование их по всей базе кода будет менее увлекательным. Независимо от того, как это работает, примите рут для всего вашего кода. Затем все классы именуются на основе обратного пути в каталогах, необходимого для того, чтобы попасть туда, и разделяются символом, таким как '_', а затем имя самого класса, однако имя файла будет названо в честь класса. Таким образом, местоположение класса кодируется в имени, и автозагрузчик может использовать это. Проблема с этим методом, кроме действительно_long_crazy_class_names_MyClass, заключается в том, что при каждом вызове выполняется немало обработки, но это может быть преждевременной оптимизацией, и снова появляются пространства имен.
например.
/code root
ClassA ClassA.php
/subfolder
subFolder_ClassB ClassB.php