Перейти к содержанию

Хук integrate_autoload

Хук integrate_autoload позволяет автоматически загружать классы и файлы с функциями именно в тот момент, когда они нужны для работы, без необходимости использовать громоздкие конструкции require_once вручную. Это реализация паттерна автозагрузки (autoloading) в SMF, которая делает код чище и эффективнее.

Расположение⚓︎

index.php (в корне форума)

<?php

call_integration_hook('integrate_autoload', [&$classMap]);

Sources/Autoload.php

<?php

IntegrationHook::call('integrate_autoload', [&$class_map]);

Во входной переменной содержится массив, где ключами являются пространства имён, а значениями — пути к файлам классов внутри директории /Sources.

Назначение⚓︎

В традиционном PHP-коде, если вам нужен какой-то класс или библиотека из другого файла, вы пишете:

<?php

require_once '/path/to/MyClass.php';

$myObject = new MyClass();

Если таких классов много, код превращается в список require_once в начале каждого файла. Это неудобно и неэффективно, так как файлы загружаются, даже если переданный запрос их не использует.

Автозагрузка решает эту проблему: PHP автоматически подключает файл с классом только в тот момент, когда вы впервые пытаетесь создать объект этого класса (new MyClass) или использовать его статически (MyClass::method()).

Хук integrate_autoload нужен, чтобы сообщить движку SMF о ваших собственных классах и файлах, которые должны быть доступны для автоматической загрузки.

Вы регистрируете путь к файлу, и когда движок встречает в коде неизвестный класс, он проверяет ваши регистрации и пытается найти и подключить нужный файл.

Использование⚓︎

Как подключать хуки

<?php

namespace Bugo\Optimus;

class Integration
{
    // В этой функции подключаем используемые хуки
    public function hooks(): void
    {
        add_integration_function('integrate_autoload', self::class . '::autoload#', false, __FILE__);
    }

    // А здесь определяем используемое пространство имён для своих классов
    public function autoload(array &$classMap): void
    {
        $classMap['Bugo\\Optimus\\'] = 'Optimus/';
    }
}

Благодаря функции выше в коде приложения при использовании пространства имён \Bugo\Optimus\ SMF будет искать нужный файл в директории /Sources/Optimus.

Данный хук обязательно пригодится при разработке приложения с пространствами имён и классами.

Хук integrate_autoload — это мощный инструмент для современной и чистой организации кода в модах и темах SMF. Он избавляет разработчика от рутины ручного подключения файлов, делает код более читаемым и соответствует современным стандартам разработки на PHP (используя автозагрузку).

См. также Автоматическая загрузка классов

Комментарии