С переходом на новую версию PHP 5.4 мне пришлось пересмотреть свои методы автоподгрузки классов. Если вы используете пространство имён то вам необходимо немного иначе пользоваться возможностями автоподгрузки классов.
Итак немного сравнения. В версии PHP 5.2.17 я писал:
function __autoload($class){ global $_SETTINGS; $files['UPLOAD_FILES'] = $_SETTINGS['doc_dir'].'/vcontrol/core/upload.class.php'; $files['WMThumbnail'] = $_SETTINGS['doc_dir'].'/vcontrol/core/thumbnail/wmthumbnail.class.php'; if (!isset($files[$class])) return ; require_once ($files[$class]); }
И при создании экземпляра класса например UPLOAD_FILES ( Ex: $upload = new UPLOAD_FILES ) , файл содержащий класс сам подгружался ($files[‘UPLOAD_FILES’] = $_SETTINGS[‘doc_dir’].’/vcontrol/core/upload.class.php’;).
Недостатками использования функции __autoload() является то что:
- нельзя переопределять ее в процессе работы.
- нет возможности активировать и деактивировать автопродгрузку в процессе работы
Все это предоставляет стандартное расширение SPL доступное в php с версии PHP 5.1.2.
Рассмотрим пример работы с этим расширением:
Напишем свой класс с методом для подгрузки классов:
class Autoload { public static function loadClass($className) { global $_SETTINGS; $class = explode('\\', $className); $files['UPLOAD_FILES'] = $_SETTINGS['doc_dir'] . '/vcontrol/core/upload.class.php'; $files['WMThumbnail'] = $_SETTINGS['doc_dir'] . '/vcontrol/core/thumbnail/wmthumbnail.class.php'; $key = $class[count($class) - 1]; if (is_file($files[$key])) { require_once $files[$key]; } else { echo ('Файл ' . $files[$key] . ' не найден!'); } } }
Обратите внимание что название класса $className передаётся в функцию вместе с пространством имён. Т .е в таком виде APPLICATION\SUBNAMESPACE\Classname.
А теперь собственно активация автоподгрузчика:
spl_autoload_register(array('Autoload ','loadClass'));
Также с помощью функции spl_autoload_unregister() деактивировать автозагрузчик классов.
spl_autoload_unregister(array('Autoload ','loadClass'));
А где собственно автоподгрузка для 5.3 — 5.4 ? Описаны методы для 5.1.2 и 5.2.17
Второй метод приспособлен для работы с пространствами имён. Т.е в версиях php 5.3 и выше.