Быстрое прототипирование: знакомство с автозагрузкой
За последние несколько постов я прошел через процесс перехода идеи от концепции к прототипу.
Конечно, есть некоторые вещи, которые вы могли бы изменить (и некоторые вещи, которые я бы изменил в отношении организации занятий). Но цель этой серии не в том, чтобы пройтись по всем различным объектно-ориентированным методам, которые можно использовать для создания решения.
Вместо этого речь идет о том, чтобы взять прототип и преобразовать его во что-то более профессиональное. Однако есть еще одна вещь, которую нам нужно сделать.
Прямо сейчас мы подключаем все наши файлы с помощью операторов require. И это хорошо работает для небольших файлов, но добавление автозагрузки в сочетании с пространствами имен может сделать приложение еще чище.
И это то, что мы собираемся сделать.
Знакомство с автозагрузкой
Вспомните из более раннего поста (если вы его читали), что автозагрузка — это простая идея:
Звучит здорово, правда? Но есть одна оговорка: вы должны написать автозагрузчик. 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
- Быстрое прототипирование: знакомство с автозагрузкой