Intereting Posts
Codeigniter – Помощник формы set_select () Как я могу поставить два оператора результатов поиска как один с помощью условного оператора? Лучший способ сделать взвешенный поиск по нескольким полям в mysql? Регулярное выражение для текста с разделителями-запятыми Как перевести конкатенированную строку в шаблон твига, используя переводчик Symfony2 Доступ к внешней переменной с использованием анонимной функции в качестве параметров Автозапуск phpBB3 Загрузка XML с помощью SimpleXML не возвращает атрибуты для некоторых элементов Цифровой знак в PHP с использованием закрытого ключа, проверьте в C # Значения массива в функции Ошибка при компиляции product.tpl с помощью smarty Отображение содержимого страницы с использованием нескольких шаблонов – WordPress Удалить элемент из массива, если он существует в массиве «запрещенных слов» Что ограничивает мои ресурсы PHP? Максимальная длина сгенерированного хэша при использовании пароля_шиба?

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

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

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

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

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

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

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

 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).
  • Вы можете добавить целые каталоги в свой поиск для своих классов.
  • Если класс уже определен, вы можете добавить больше логики, чтобы справиться с ним.
  • Вы можете использовать условное определение класса в своем коде, а затем переопределить определение класса в загрузчике классов.

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

 new myAutoloaderClass(); 

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

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

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

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

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

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

 <plugin-path>/class-main.php