✅ WEB і WordPress новини, теми, плагіни. Тут ми ділимося порадами і кращими рішеннями для сайтів.

Як реалізувати автозавантажувач із просторами імен у вашій темі або плагіні WordPress

7

Якщо ви пишете об’єктно-орієнтований код, автозавантажувач є обов’язковим. Без автозавантажувача вам потрібно буде додати рядок із файлом класу, перш ніж ви зможете його ініціалізувати. Це може швидко стати громіздким, коли ви працюєте з великою кількістю класів. Автозавантажувач — це функція, яка запускається щоразу, коли створюється екземпляр нового класу, і включає файл класу до створення екземпляра.

Простори імен — це спосіб структурування та інкапсуляції вашого коду, який допомагає уникнути зіткнень імен. Якщо ви збираєтеся писати ООП, також рекомендується використовувати простори імен. Майте на увазі, що ви можете реалізувати автозавантажувач без використання просторів імен у своєму OOP-коді.

Ви можете використовувати цей код для своєї теми чи плагіна WordPress або будь-який код PHP за межами WordPress – просто змініть шляхи відповідним чином. Для цього прикладу я створюю автозавантажувач для теми WordPress.

Правила для простору імен класу та структури

Реалізація автозавантажувача вимагатиме певних правил для структури коду та місця їх пошуку. Використання просторів імен дещо спрощує це, оскільки ваш простір імен може посилатися на папку, у якій знаходяться класи.

Спочатку прийміть рішення про назву вашого простору імен. Зазвичай це щось унікальне для вашого коду, наприклад назва вашої теми. Наприклад, простір імен для теми цього сайту – AWhitePixelTheme. Це означає, що для роботи автозавантажувача будь-які класи мають бути в цьому просторі імен.

namespace AWhitePixelTheme;

Моє перше правило полягає в тому, що будь-який файл класу завжди міститиме лише один клас, а ім’я класу має збігатися з ім’ям файлу. Наприклад; клас MyTestповинен бути визначений у файлі MyTest.php.

Моє друге правило — як структурувати класи в папках. Я вирішив, що всі класи містяться в папці srcв моїй темі. Я можу помістити файли класів безпосередньо в цю папку, і для цього вони мають бути всередині «кореневого» простору імен, визначеного вище. Але якщо я хочу створити вкладені папки та помістити в них файли класів, їхні простори імен повинні містити структуру папок. Наприклад, клас файл MyTest.php, який знаходиться в папці src/Test/, повинен мати цей простір імен:

namespace AWhitePixelThemeTest;

Створення автозавантажувача

Мені подобається зберігати автозавантажувач в окремому файлі та поза src/папкою, яка визначена лише для файлів класів із простором імен. Як приклад, я створю файл autoloader.phpу папці inc/своєї теми.

У PHP є вбудована функція автозавантаження: spl_autoload_register. Ви вказуєте назву функції автозавантажувача як параметр, і в цій функції ви отримуєте запитаний клас як аргумент (те, що ви ставите після newпід час створення екземпляра класу). При створенні екземплярів класів із просторами імен, наприклад new AWhitePixelThemeTestMyTest(), наданою змінною для цієї функції буде "AWhitePixelThemeTestMyTest".

Давайте додамо функцію автозавантаження та визначимо в ній необхідний простір імен для автозавантажувача:

Потім нам потрібно включити цей файл, щоб наш автозавантажувач був зареєстрований. Оскільки це в темі, я додам включення до теми functions.php. Якщо ви використовуєте це для плагіна, розмістіть його у своїх файлах плагіна. Файл автозавантажувача потрібно додати завчасно, перед створенням екземплярів класів. Я розміщую це в першому рядку свого functions.php:

require_once(get_template_directory(). '/inc/autoloader.php');

Якщо ви використовуєте його для дочірньої теми або плагіна, змініть шлях відповідно до ваших потреб.

І це все. Зараз автозавантажувач на місці, але він нічого не робить. Повернемося до функції автозавантаження і закінчимо її.

Написання та тестування функції автозавантаження

Спочатку нам потрібно переконатися, що запитане ім’я класу дійсно знаходиться в нашому просторі імен. Ми просто перевіряємо, чи надане ім’я класу простору імен містить рядок простору імен, і якщо ні, виходимо з функції. Після цього ми видаляємо назву простору імен із рядка, щоб ми могли опрацювати будь-які підпапки та файл класу.

Тепер ми перетворимо наданий простір імен у фактичний шлях до файлу. По-перше, ми замінимо будь-яку зворотну косу риску ""в просторі імен на символ роздільника папок – для цього ми використовуємо константу PHP DIRECTORY_SEPARATOR. У самому кінці додаємо ".php". І нарешті перед рядком ми додаємо повний кореневий шлях. Оскільки це всередині теми, я використовую get_template_directory(). Якщо ви використовуєте це для плагіна, використовуйте метод, який повертає повний шлях до вашого плагіна.

... $class = str_replace($namespace, '', $class);   $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php'; $directory = get_template_directory(); $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class; }

Все, що нам зараз потрібно зробити, це перевірити, чи існує файл, і, якщо він існує, вимагати його.

... $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;   if (file_exists($path)) { require_once($path); } }

Це воно!

Давайте перевіримо це. Створіть підпапку Testв src/папці вашої теми та помістіть у неї файл php під назвою MyTest.php. Визначте в ньому клас MyTest, дотримуючись правил для простору імен: AWhitePixelThemeTest. Я просто додам відбиток «Success» у функцію конструкції, щоб ми могли легко побачити, що вона насправді ініціалізує клас.

У нашому functions.php після запиту автозавантажувача ми просто створюємо екземпляр класу:

$test = new AWhitePixelThemeTestMyTest();

Оновіть свій сайт WordPress і переконайтеся, що ви отримали "Успіх!" виводиться.

Автозавантажувач автоматично завантажуватиме будь-які файли класів, які знаходяться всередині нашого визначеного простору імен, і дотримується правильних правил. Ви можете створювати екземпляри класів з будь-якого місця у своїй темі, навіть із самих класів.

Повна функція автозавантаження

Для довідки, ось наша остання функція автозавантаження:

spl_autoload_register('awhitepixel_autoloader'); function awhitepixel_autoloader($class) { $namespace = 'AWhitePixelTheme';   if (strpos($class, $namespace) !== 0) { return; }   $class = str_replace($namespace, '', $class); $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php';   $directory = get_template_directory(); $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;   if (file_exists($path)) { require_once($path); } }

Джерело запису: awhitepixel.com

Цей веб -сайт використовує файли cookie, щоб покращити ваш досвід. Ми припустимо, що з цим все гаразд, але ви можете відмовитися, якщо захочете. Прийняти Читати далі