Швидке створення прототипів: представлення автозавантаження
Протягом кількох останніх публікацій я ознайомився з процесом переходу ідеї від концепції до прототипу.
Звичайно, є деякі речі, які ви можете змінити (і є деякі речі, які я б змінив щодо організації занять). Але суть цієї серії не полягає в тому, щоб пройти через усі різноманітні об’єктно-орієнтовані техніки, які можна використовувати для створення рішення.
Натомість йдеться про те, щоб взяти прототип і перетворити його на щось трохи більш професійне. Але ще є одна річ, яку ми повинні зробити.
Наразі ми включаємо всі наші файли за допомогою операторів вимоги. І це добре працює для невеликих файлів, але запровадження автозавантаження в поєднанні з просторами імен може зробити програму ще чистішою.
І це те, що ми збираємося зробити.
Представляємо автозавантаження
Згадайте з попередньої публікації (якщо ви її читали), що автозавантаження — це проста ідея:
Звучить чудово, правда? Але є застереження: вам потрібно написати автозавантажувач. PHP не може розібратися сам.
І ось чому я прихильник того, щоб наші простори імен також дотримувалися узгодженої структури каталогів: якщо ви аналізуєте простір імен і ім’я файлу, відносно легко побудувати шлях до файлу та автоматично завантажити його.
Звучить заплутано? По-перше, давайте подивимося, де ми розмістимо автозавантажувач стосовно нашої структури каталогів:
Далі оновіть файл початкового завантаження плагіна, щоб він вимагав лише файл автозавантаження.
<?php
/**
* Three Recent Posts
*
* @package TRP
* @author Tom McFarlin
* @copyright 2017 Tom McFarlin
* @license MIT
*
* @wordpress-plugin
* Plugin Name: Three Recent Posts
* Plugin URI: https://tommcfarlin.com/three-recent-posts/
* Description: Displays the three mot recent posts in your post editor screen.
* Version: 1.0.0
* Author: Tom McFarlin
* Author URI: https://tommcfarlin.com
* Text Domain: three-recent-posts
* License: GPL
* License URI: http://www.gnu.org/licenses/gpl-3.0.txt
*/
namespace McFarlinTRP;
use McFarlinTRPDisplayMeta_Box;
// Import the autoloader.
include_once 'Includes/autoload.php';
add_action( 'add_meta_boxes', __NAMESPACE__. 'trp_start' );
/**
* Starts the plugin.
*/
function trp_start() {
$meta_box = new Meta_Box( dirname( __FILE__) );
$meta_box->init();
}
Звичайно, нам потрібен автозавантажувач для завантаження наших файлів. По суті, це працює так:
- розділити компоненти імені вхідного файлу (наприклад, шлях до каталогу та ім’я файлу),
- замініть будь-які підкреслення дефісами, щоб переконатися, що файл відповідає структурі назви файлу класу,
- почніть створення повного імені шляху (яким є каталог, ім’я файлу тощо),
- перебирати простір імен до імені класу та створювати повне ім’я для файлу,
- включити його в проект.
Це прямолінійно, чи не так? Якщо ви дотримуєтеся узгодженого простору імен, каталогу, назви класу та схеми іменування файлів, ви можете повторно використовувати той самий автозавантажувач у будь-яких проектах.
Ось копія автозавантажувача, який я використовую, і додаю його майже до будь-якого проекту, який я використовую. Ви побачите, що він точно відповідає тому, що розглянуто вище:
<?php
/**
* Automatically loads the specified file.
*
* @package McFarlinTFP
*/
namespace McFarlinTFP;
/**
* Automatically loads the specified file.
*
* Examines the fully qualified class name, separates it into components, then creates
* a string that represents where the file is loaded on disk.
*
* @package McFarlinTFP;
*/
spl_autoload_register(function( $filename) {
// First, separate the components of the incoming file.
$file_path = explode( '', $filename );
// Get the last index of the array. This is the class we're loading.
if (isset( $file_path[ count( $file_path) - 1 ])) {
$class_file = strtolower(
$file_path[ count( $file_path) - 1 ]
);
/**
* The classname has an underscore, so we need to replace it
* with a hyphen for the file name.
*/
$class_file = str_ireplace( '_', '-', $class_file );
$class_file = "class-$class_file.php";
}
/**
* Find the fully qualified path to the class file by iterating through the $file_path array.
* We ignore the first index since it's always the top-level package. The last index is always
* the file so we append that at the end.
*/
$fully_qualified_path = trailingslashit(
dirname(
dirname( __FILE__)) );
/**
* We start at the second index of the namespace because our directory
* structure does not include 'McFarlin/TRP'.
*/
for ($i = 2; $i < count( $file_path) - 1; $i++) {
$dir = strtolower( $file_path[ $i ] );
$fully_qualified_path .= trailingslashit( $dir );
}
$fully_qualified_path .= $class_file;
// Now we include the file.
if (file_exists( $fully_qualified_path)) {
include_once( $fully_qualified_path );
}
});
Таким чином, плагін завершується до версії 1.0.0. Ви можете перевірити це на GitHub (як буквально, так і просто для огляду). І, сподіваюся, це допомогло пройти через процес переходу від швидкого прототипування до концепції в рамках концепції WordPress.
Повідомлення серії
- Швидке створення прототипів за допомогою WordPress: від концепції до плагіна
- Швидке створення прототипів за допомогою WordPress: аналіз концепції
- Швидке створення прототипів: прототип до коду, частина 1
- Швидке створення прототипів: прототип до коду, частина 2
- Швидке створення прототипів: представлення автозавантаження