Автозагрузка собственных классов 1C Bitrix

Большинство разработчиков объектно-ориентированных приложений используют такое соглашение именования файлов, в котором каждый класс хранится в отдельно созданном для него файле. Одна из самых больших неприятностей - необходимость писать в начале каждого скрипта длинный список подгружаемых файлов (по одному для каждого класса).

В PHP 5 это делать необязательно. Функция spl_autoload_register() позволяет зарегистрировать необходимое количество автозагрузчиков для автоматической загрузки классов и интерфейсов, если они в настоящее время не определены.

Регистрируя автозагрузчики, PHP получает последний шанс для интерпретатора загрузить класс прежде, чем он закончит выполнение скрипта с ошибкой.

Ну начнем.

  1. Зарегистрируем нашу новую функцию через spl_autoload_register() назвал я ее 'AutoloaderByCreatik'
spl_autoload_register('AutoloaderByCreatik',true);
  1. Обьявим нашу функцию с одним параметром $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); //Подключаем класс
        }
    }
}
  1. Чтобы не прописывать пути сделаем перебор всех папок и поиска этого файла с таким названием в папке /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');

 


Теги:
ВВЕРХ