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