четверг, 23 марта 2023 г.

PHP, ООП, автозагрузка классов (файлы классов в разных каталогов)

При разработке web-приложения на языке PHP с применением средств объектно-ориентированного программирования (ООП), удобно использовать автоматическую загрузку классов, особенно когда классов много, чтобы не использовать require_once или include для каждого файла, содержащего определенным класс.

Идея основана на применении функции Standart PHP Library - spl_autoload_register().
При создании класса: $class = new Class1(), если класс не найден, то вызывается функция spl_autoload_register().

Каждый класс хранится в отдельном файле.

Файл: /test/Framework/Autoloader.php
class Autoloader
{
    // Список каталогов, в которых расположены классы
    public static $dir_list = array('Framework/Core/', 'Framework/UI/');

    public static function register()
    {
        ini_set('unserialize_callback_func', 'spl_autoload_call');
        spl_autoload_register(array(new self, 'autoload'));
    }

    private static function autoload($class)
    {
        foreach (self::$dir_list as $dir)
        {
            $file = trim($dir, '/').'/'.$class.'.php';
            if (is_file($file))
            {
                require_once($file);
            }
        }
    }
}

Файл: /test/index.php
<?php
    required_once('Framework/Autoloader.php');

    // в случае если каталог поиска файлов классов надо установить свой
    // Autoloader::$dir_list = array('Framework/UI');

     Autoloader::register();

    $core = new Core();
    $menu = new Menu();
?>

Autoloader::$dir_list = позволяет определить массив строк, определяющих каталоги, в которых необходимо искать используемые файлы классов, или если для проекта список каталогов является одним и тем же списком, то этот список каталогов можно прописать прямо в статическую переменную класса Autoload `public static $dir_list = ...` и Autoloader::$dir_list не использовать.

Структура каталогов:
/test
    /Framework
        /Core
            Core.php

        /UI
            Menu.php

    Autoloader.php

index.php

Комментариев нет:

Отправить комментарий

Docker. Первые контейнеры

Источник:  php.dragomano.ru Структура каталогов: ~/develop/web/project/                  nginx/      - сервис web-сервера                php...