Статьи

SmartLoader Reloaded

Несколько месяцев назад я предложил способ эффективного использования __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 когда- нибудь решат эту проблему.