✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Быстрое прототипирование: знакомство с автозагрузкой

25

За последние несколько постов я прошел через процесс перехода идеи от концепции к прототипу.

Конечно, есть некоторые вещи, которые вы могли бы изменить (и некоторые вещи, которые я бы изменил в отношении организации занятий). Но цель этой серии не в том, чтобы пройтись по всем различным объектно-ориентированным методам, которые можно использовать для создания решения.

Вместо этого речь идет о том, чтобы взять прототип и преобразовать его во что-то более профессиональное. Однако есть еще одна вещь, которую нам нужно сделать.

Прямо сейчас мы подключаем все наши файлы с помощью операторов 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();
}

Конечно, нам нужен автозагрузчик для загрузки наших файлов. По сути, это работает следующим образом:

  1. отделить компоненты имени входящего файла (например, путь к каталогу и имя файла),
  2. замените любые символы подчеркивания дефисами, чтобы убедиться, что файл соответствует структуре имени файла класса,
  3. начать создание полного имени пути (которое является каталогом, именем файла и т. д.),
  4. перебирать пространство имен до имени класса и создавать полное имя для файла,
  5. включить его в проект.

Это прямолинейно, не так ли? Если вы придерживаетесь согласованного пространства имен, каталога, имени класса и схемы именования файлов, вы можете повторно использовать один и тот же автозагрузчик в любых проектах.

Вот копия автозагрузчика, который я использую, и добавляю его почти в любой проект, который использую. Вы увидите, что это точно следует тому, что описано выше:

<?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.

Сообщения серии

  1. Быстрое прототипирование с помощью WordPress: от концепции до плагина
  2. Быстрое прототипирование с помощью WordPress: анализ концепции
  3. Быстрое прототипирование: от прототипа к коду, часть 1
  4. Быстрое прототипирование: от прототипа к коду, часть 2
  5. Быстрое прототипирование: знакомство с автозагрузкой

Источник записи: tommcfarlin.com

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