В последних статьях мы рассмотрели преимущества пространств имен и автозагрузчиков классов в PHP. Несмотря на явные преимущества использования этих возможностей, WordPress-разработчики все же редко к ним прибегают. Весомая причина: WordPress продолжает поддерживать версию PHP 5.2, которая уже сильно устарела.
Автозагрузчики классов были доступны в разных формах еще до PHP 5.3. Однако новейшие автозагрузчики классов – которые обычно и используются в разработке PHP – требует пространств имен, появившихся только в PHP 5.3.
В данной статье я покажу вам, как создать и использовать свой собственный автозагрузчик классов, придерживаясь существующих стандартов PHP. Я также поговорю про использование автозагрузчика Composer.
Я не думаю, что в ядре WordPress в данный момент должен появиться автозагрузчик. Я также не считаю, что все стандарты разработки ядра – в частности, именование классов, а также отказ от использования автозагрузчиков и пространств имен – должны расширяться на разработку плагинов или сайтов.
Использование возможностей PHP, которые не имеют обратной совместимости с PHP 5.2, представляет собой проблему для проектов, выпущенных публично.
Как показывает мой опыт, большинство пользователей, которые сталкиваются с этим, понятия не имеют, что они работают с такой вот устаревшей версией. Большинство пользователей, получивших соответствующие знания и убедившись в том, что обновление несет в себе преимущества в плане защиты и производительности, обращаются к хостингу с просьбой перехода на новую PHP-версию. Такое обновление обычно осуществляется при помощи нескольких кликов в cPanel.
Что представляет собой автозагрузчик классов?
Автозагрузчик классов – это система для автоматической загрузки классов, включая их файлы. Если вы придерживаетесь общепризнанной системы именования файлов, а также используете стандартный автозагрузчик, вы можете использовать любой класс без ручного включения файла.
Автоматическое включение файла кажется не таким значимым преимуществом, однако на практике несет в себе огромную выгоду: с его помощью вы можете легко создавать небольшие, более простые в управлении, реюзабельные классы. Также вы можете легко проводить рефакторинг ваших классов, используя IDE (к примеру, phpStorm). В дополнение ко всему, такой подход устраняет разные человеческие ошибки.
Выбор стандарта
PHP Framework Interop Group – это группа PHP-пользователей, состоящая из представителей большинства основных PHP-фреймворков и систем управления контентом. Эта группа устанавливает стандарты для популярных практик PHP-разработки. Она определила два стандарта для автозагрузчиков: PSR-0 и PSR-4.
По большей части, эти два стандарта очень похожи, однако они имеют два существенных отличия. Во-первых, PSR-4 требует использования пространств имен, что я уже обсуждал ранее. Во-вторых, корневая директория для проектов, которые придерживаются стандарта PSR-4, не должна равняться своему корневому пространству имен.
В преобладающем большинстве случаев лучшего всего следовать стандарту PSR-4. Исключение состоит лишь в обратной совместимости – если требуется PHP 5.2, то тогда PSR-4 не подойдет, поскольку он требует пространств имен.
Отказ от стандарта
Вам не нужно придерживаться стандартов, чтобы использовать автозагрузку классов. Также вам не нужно это, чтобы использовать автозагрузчик Composer. Вы можете создать свой собственный стандарт.
Приверженность стандарту упрощает работу с Composer; он позволяет вам использовать один автозагрузчик для несколько библиотек. Последний случай особенно полезен в разработке сайта с нуля, когда вам нужно разработать многочисленные плагины, каждый со своей собственной функциональностью.
Автозагрузчик Composer не требует следования стандартам PSR-0 или PSR-4. Однако следование одному из этих стандартов заметно упрощает использование автозагрузчика. Если вы не хотите следовать этим стандартам, вы всегда можете использовать Composer Classmap для автоматической загрузки классов в автозагрузчике Composer.
Использование автозагрузчика Composer
Один из самых простых способов использовать автозагрузчик классов – это воспользоваться автозагрузчиком Composer для передачи вашего кода в библиотеки. Это упрощает последующее использование кода и его шаринг. Создание библиотек Composer мы рассмотрим в следующей статье.
Использование автозагрузчика Composer осуществляется просто:
require_once( 'vendor/autoload.php' );
Для разработки всего сайта с нуля можно создать одну vendor директорию для всего сайта. Для разработки плагинов и в некоторых других случаях вы можете создать несколько vendor директорий. Это нормально, хотя развертывание в таком случае может стать более сложным.
Использование автозагрузчика PSR-4
Использовать автозагрузчик PSR-4 очень просто, если вы правильно задали пространства имен для ваших классов. Каждая библиотека имеет свою корневую директорию и пространство имен. У каждого класса должно быть то же самое имя, что и у файла, и если вы используете вложенные пространства имен, то в таком случае структура каталогов файла должна соответствовать иерархии пространства имен.
К примеру, если вы используете корневое пространство имен fun, и у вас есть класс под названием process в подпространстве имен shortcodes, то в таком случае следующее будет верно про данный класс:
1. Он должен быть в файле process.php
2. Он должен быть в директории shortcodes
3. Эта директория должна быть подкаталогом основного пространства имен
Вот как будет выглядеть этот класс:
<?php namespace fun\shortcode; class process { }
Естественно, чтобы этот код работал, ваша библиотека должна быть зарегистрирована в автозагрузчике. Сделать это можно двумя способами. Если вы работаете с библиотекой Composer, то в таком случае вам просто надо определить ее в своем файле composer.json.
"autoload": { "psr-4": {"fun\\": "src/"} }
В примере выше мы предполагаем, что корневая директория библиотеки называется src.
Корневой уровень библиотеки Composer содержит только readme, файл Composer, а также две директории (src и test). В последнем будут находиться модульные тесты библиотеки.
Если вам нужно использовать свой собственный автозагрузчик, просто скопируйте автозагрузчик из примера PSR-4. Обязательно снабдите префиксом имя класса, а также вручную включите файл.
Как только у вас будет все это, вам нужно будет зарегистрировать каждое корневое пространство имен. Подпространства имен будут автоматически работать.
Вот, как мы бы зарегистрировали наше пространство имен fun:
<?php // instantiate the loader $loader = new \slug_autoloader // register the "fun" namespace //we are assuming that the root namespace is in "src", a subdir of the current directory. $loader->addNamespace('fun', dirname( __FILE__ ) . '/src' ); // register the autoloader $loader->register();
Имейте в виду, что нет никакой потребности в том, чтобы использовать больше одного автозагрузчика на сайте.
Источник: http://torquemag.io