Автозагрузчик классов в плагине wordpress

Я хочу написать автозагрузчик классов для использования в плагине WordPress. Этот плагин будет установлен на нескольких сайтах, и я хочу свести к минимуму вероятность конфликтов с другими плагинами.

Автозагрузчик будет примерно таким:

function __autoload($name) {
    //some code here
}

Моя главная проблема заключается в том, что произойдет, если другой класс также использует подобную функцию? Я думаю, что это обязательно вызовет проблемы. Что было бы лучшим способом избежать чего-то подобного?

Я пытаюсь не использовать пространства имен, поэтому код будет работать и в предыдущих версиях php.


person user4493177    schedule 29.08.2015    source источник
comment
Вы хотите автоматически загружать несколько классов или один? Вы должны посмотреть php.net/manual/en/function.spl- автозагрузка-register.php   -  person Daryll Doyle    schedule 30.08.2015


Ответы (2)


Используйте некоторую реализацию, подобную этой.

function TR_Autoloader($className)
{
    $assetList = array(
        get_stylesheet_directory() . '/vendor/log4php/Logger.php',
        // added to fix woocommerce wp_email class not found issue
        WP_PLUGIN_DIR . '/woocommerce/includes/libraries/class-emogrifier.php'
        // add more paths if needed.
    );

// normalized classes first.
    $path = get_stylesheet_directory() . '/classes/class-';
    $fullPath = $path . $className . '.php';

    if (file_exists($fullPath)) {
        include_once $fullPath;
    }

    if (class_exists($className)) {
        return;
    } else {  // read the rest of the asset locations.
        foreach ($assetList as $currentAsset) {
            if (is_dir($currentAsset)) {
               foreach (new DirectoryIterator($currentAsset) as $currentFile) 
{
                    if (!($currentFile->isDot() || ($currentFile->getExtension() <> "php")))
                        require_once $currentAsset . $currentFile->getFilename();
                }
            } elseif (is_file($currentAsset)) {
                require_once $currentAsset;
            }

        }
    }
}

spl_autoload_register('TR_Autoloader');

В основном этот автозагрузчик зарегистрирован и имеет следующие особенности:

  • Вы можете добавить определенный файл класса, если не следуете определенному шаблону для расположения файлов, содержащих ваши классы (assetList).
  • Вы можете добавлять целые каталоги в поиск ваших классов.
  • Если класс уже определен, вы можете добавить дополнительную логику для работы с ним.
  • Вы можете использовать условное определение класса в своем коде, а затем переопределить определение класса в загрузчике классов.

Теперь, если вы хотите сделать это в ООП, просто добавьте функцию автозагрузки внутри класса. (то есть: myAutoloaderClass) и вызовите его из конструктора. затем просто добавьте одну строку внутри вашего functions.php

new myAutoloaderClass(); 

и добавить в конструктор

function __construct{
   spl_autoload_register('TR_Autoloader' , array($this,'TR_Autoloader'));
}

Надеюсь это поможет. HR

person Hugo R    schedule 19.08.2017

Я рекомендую использовать пространства имен и PSR-4. Вы можете просто скопировать этот пример автозагрузчика с фиг..

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

Так, например, если вы вызываете класс «Основной», то этот автозагрузчик попытается включить файл класса из пути:

<plugin-path>/class-main.php
person foxtrot    schedule 04.04.2016