Несколько месяцев назад я предложил способ эффективного использования __autoload () вместе с индексатором классов. К моему удивлению, довольно многие начали его использовать и предоставили мне отчеты об ошибках. Я переписал большую часть оригинального кода, устранил все известные ошибки и тестировал его в течение последнего месяца. Итак, вот новая версия с некоторыми улучшениями:
- Также добавлена возможность сканирования включаемых каталогов
- Использование SPL RecursiveDirectoryIterator для индексатора / сканера
- Оптимизированный SmartLoader :: load (). Теперь требуется <1 мс для завершения (с включением) на моей машине
- Поддержка Windows через константу DIRECTORY_SEPARATOR
- Дополнительная информация в заголовочных файлах индекса, например:
* Created by: /usr/local/php5/lib/php/SmartLoader/SmartLoader.class.php
* Created at: Thu, 06 Apr 2006 23:54:48 +0200
* Scanned: 134 directories and 402 files in 1.15 seconds.
Обратная совместимость?
Роберт Шмельцер откопал самую замечательную ошибку. Начиная с PHP 5.1.2 этот фрагмент кода больше не будет работать:
preg_match_all('/hand/', 'Talk to the hand!', $result = array()));
Переменная $ result будет пустой, если я не удалю «= array ()». Почему?
Конечно, можно поспорить о том, как много смысла инициализировать результат в виде массива. С моей точки зрения, это делает код более читабельным, показывая, что я передаю пустой массив для заполнения. Я полагаю, Дерик , с другой стороны, назвал бы это «делать что-то глупое ». 😉
Как пользоваться
Лучший способ использовать SmartLoader — поместить содержимое соединительной линии SVN в каталог include (не забудьте получить доступ на запись для SmartLoader / indexfiles). После этого вы можете легко настроить его в своих скриптах, добавив следующие две строки:
require('smartloader.php');
SmartLoader::addIncludeDir(dirname(__FILE__).'/../'); /* (or just the document root) */
Я настоятельно рекомендую ставить префиксы перед вашими классами, особенно при использовании удобного сканирования каталогов include, иначе вы получите конфликт имен. Возможно, пространства имен PHP когда- нибудь решат эту проблему.