Большинство разработчиков объектно-ориентированных приложений используют такое соглашение именования файлов, в котором каждый класс хранится в отдельно созданном для него файле. Одна из самых больших неприятностей - необходимость писать в начале каждого скрипта длинный список подгружаемых файлов (по одному для каждого класса).
В PHP 5 это делать необязательно. Функция spl_autoload_register() позволяет зарегистрировать необходимое количество автозагрузчиков для автоматической загрузки классов и интерфейсов, если они в настоящее время не определены.
Регистрируя автозагрузчики, PHP получает последний шанс для интерпретатора загрузить класс прежде, чем он закончит выполнение скрипта с ошибкой.
Ну начнем.
- Зарегистрируем нашу новую функцию через spl_autoload_register() назвал я ее 'AutoloaderByCreatik'
spl_autoload_register('AutoloaderByCreatik',true);
- Обьявим нашу функцию с одним параметром $class
function AutoloaderOptik( $class ){
$class = explode("\\", $class);
$class = array_pop($class);
$lib = $_SERVER['DOCUMENT_ROOT']."/bitrix/php_interface/class"; // Путь к классам
preg_match("/Extends/",$class,$matches); // Классы будем искать по наличию слова Extends
if($matches){
$folder = scanDirectories($lib, $class);// Функция поиска классов в папке $lib
if($folder) {
include_once($folder); //Подключаем класс
}
}
}
- Чтобы не прописывать пути сделаем перебор всех папок и поиска этого файла с таким названием в папке /php_interface/class/.
function scanDirectories($rootDir, $class, $allData = array())
{
$invisibleFileNames = array(".","..",".htaccess",".htpasswd");
$dirContent = scandir($rootDir);
foreach($dirContent as $key => $content){
$path = $rootDir.'/'.$content;
if(!in_array($content, $invisibleFileNames)){
if(file_exists($rootDir.'/'.$class.'.class.php')){
return $path;
}
elseif(is_dir($path) && is_readable($path)){
// recursive callback to open new directory
$allData = scanDirectories($path,$class,$allData);
if($allData) return $allData;
}
}
}
return 0;
}
чтобы все заработала, надо зарегистрировать также "битриксовую" __autoload c помощью spl_autoload_register
spl_autoload_register('__autoload');