Загрузка...

Автозагрузка классов в WordPress

Автозагрузка php файлов и классов в WordPress

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

Автозагрузчик всегда пишется в основном подключаемом файле плагина, функция автозагрузки называется spl_autoload_register и вызывается до инициализации(создания или вызова) любых объектов.

  1. Пример 1. Подключаемые классы располагаются в директории includes в корне плагина и имеют названия согласно PSR стандарту, но не имеют специальных неймспейсов. Тогда код автозагручика будет выглядеть так:
    SA1jHbi

    spl_autoload_register(function ($className){
        $path = realpath(__DIR__ . '/includes/' . strtr($className, '/', DIRECTORY_SEPARATOR) . '.php');
        if (is_readable($path)) {
            include_once $path;
        }
    });

    Пример класса из файла LicHelper.php :

    <?php
    /**
     * something class
     */
    class LicHelper {
    	
    }
    
  2. Пример. Когда нужно подключить классы и создать неймспесы. Так же кладем классы в includes и называем их и их файлы согласно PSR. У каждого класса в includes прописываем
    namespace my_nampespace;
    у классов находящихся в поддиректориях прописываем
    namespace my_nampespace\subdir;

    spl_autoload_register(function ($className){
        if ( strpos( $className, __NAMESPACE__  ) !== 0 ) {
            return;
        }
        $className = str_replace(__NAMESPACE__ . '\\', 'includes\\', $className);
        $path = realpath(__DIR__) . DIRECTORY_SEPARATOR . strtr($className, '\\', DIRECTORY_SEPARATOR) . '.php';
        if (is_readable($path)) {
            require_once $path;
        }
    });
  3. WordPress autoloader для классов написанных в соответствии код стайлом WordPress (class-classname).php
    /**
     * WordPress Autoload classes.
     */
    spl_autoload_register( function ( $full_class_name ) {
        if ( strpos( $full_class_name, __NAMESPACE__  ) !== 0 ) { // . '\Core'
            return; // Not in the plugin namespace, don't check.
        }
        $full_class_name = strtolower( str_replace( '_', '-', $full_class_name ) );
        $class_parts     = explode( '\\', $full_class_name );
        unset( $class_parts[0] ); // Unset the __NAMESPACE__.
    
        $class_file    = 'class-' . array_pop( $class_parts ) . '.php';
        $class_parts[] = $class_file;
    
        require_once plugin_dir_path( __FILE__ ) . implode( DIRECTORY_SEPARATOR, $class_parts );
    } );
    

P.S. Если вам требуется сделать автозагрузку php файлов для простых функций находящихся в рандомных файлах, это можно сделать так:

/**
*  Include all php file in "functions" folder and subfolder
*/
foreach ( glob( __DIR__ . 'functions/*/*.php' ) as $file ){
    include_once $file;
}

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

Так же стоит упомянуть, что есть функция __autoload(), но она является устаревшей и поэтому даже рассматривать ее не нужно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *