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