/
bitrix-dev
/
Starter-kit
Обзор
Документация
Войти
/
bitrix-dev
/
Starter-kit
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
main
local/php_interface/init/override.php
67 строк
3 KB
Alexey Karizhenskiy
Переопределение классов
05 мар 2026, 22:22
05 мар 2026, 22:22
fd641dd
Код
Авторство
О чём код?
<?php /** * Регистрация автозагрузчика, позволяющая подменить файлы */ /** * Директория с размещёнными классами для перегрузки */ $classDirectoryPath = __DIR__ . '/classes/Override'; /** * Конфигуратор переопределяемых классов */ $config = [ //'CSocNetUserToGroup' => [ // 'classPath' => __DIR__ . '/../../bitrix/modules/socialnetwork/classes/mysql/user_group.php', // 'overrideClass' => 'CSocNetUserToGroup' //], ]; spl_autoload_register( function ($baseClassName) use ($config, $classDirectoryPath) { if (empty($config[$baseClassName])) { return; } $classParts = explode('\\', $baseClassName); $className = array_pop($classParts); $namespace = implode('\\', array_filter($classParts)); $virtualClassName = '___Virtual' . $className; // Загружаем оригинальный класс Bitrix и переименовываем его в ___VirtualCUser if (file_exists($config[$baseClassName]['classPath'])) { $classContent = file_get_contents($config[$baseClassName]['classPath']); $classContent = preg_replace('#^<\?(?:php)?\s*#', '', $classContent); $classContent = str_replace("class {$className}", "class {$virtualClassName}", $classContent); eval($classContent); } // Загружаем класс-перехватчик CUser из модуля и заставляем его наследоваться от ___VirtualCUser $classFilePath = $classDirectoryPath . '/' . str_replace('\\', '/', $config[$baseClassName]['overrideClass']) . '.php'; if (file_exists($classFilePath)) { $overrideClassContent = file_get_contents($classFilePath); $overrideClassContent = preg_replace('#^<\?(?:php)?\s*#', '', $overrideClassContent); // Меняем extends на виртуальный класс $overrideClassContent = preg_replace( '#extends\s+([^\s]+)#', "extends {$virtualClassName}", $overrideClassContent ); // Подменяем пространство имён на то же, что и у исходного класса (для CUser — глобальное) $overrideClassContent = preg_replace( '#namespace\s+([^\s;]+);#', $namespace ? "namespace {$namespace};" : '', $overrideClassContent ); eval($overrideClassContent); } }, true, true );