Если вы разрабатываете плагин или тему, вы обязательно столкнетесь в необходимостью подключить классы в свой плагин.
Это можно реализовать несколькими способами, использовав composer или прописав загрузку файлов самому, если вы не планируете использовать библиотеки или composer. Далее я приведу несколько примеров, как можно создать свой автозагрузчик файлов и классов.
Автозагрузчик всегда пишется в основном подключаемом файле плагина, функция автозагрузки называется spl_autoload_register
и вызывается до инициализации(создания или вызова) любых объектов.
- Пример 1. Подключаемые классы располагаются в директории includes в корне плагина и имеют названия согласно PSR стандарту, но не имеют специальных неймспейсов. Тогда код автозагручика будет выглядеть так:
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 { }
- Пример. Когда нужно подключить классы и создать неймспесы. Так же кладем классы в 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; } });
- 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()
, но она является устаревшей и поэтому даже рассматривать ее не нужно.