Как использовать пространства имен и автозагрузку классов в разработке WordPress

Дата публикации:Февраль 18, 2015

Крис Эпри не так давно опубликовал прекрасный пост о том, почему поддержка WordPress старых версий PHP (особенно PHP 5.2) мешает разработчикам в полной мере воспользоваться всеми преимуществами языка, который активно развивался в течение восьми лет (или около того).

Две самых прекрасных возможности PHP, которые разработчики WordPress обычно обходят стороной, поскольку эти возможности не поддерживаются в полной мере в PHP 5.2 – это SPL-автозагрузчики и пространства имен. Эти две дополнительных функции упрощают использование небольших, реюзабельных и более управляемых классов. В техническом плане в PHP 5.0 уже была автозагрузка, однако добавление пространств имен в 5.3 позволило применять автозагрузчики Composer и PSR-4. Существуют обходные пути для 5.2, позволяющие обойтись без пространств имен, однако на дворе уже стоит 2015 год, поэтому нет никакого смысла обращаться к медленной, неподдерживаемой версии PHP.

Понимание того, как работает пространство имен и автозагрузчики, поможет вам комфортно работать с PHP-библиотеками, которые не были написаны под WordPress, однако создавались с учетом существующих PHP-стандартов. Стоит отметить, что вы можете использовать автозагрузчики и без пространств имен или без соблюдения последних стандартов. К примеру, Карл Александр объясняет то, как создать автозагрузчик, который будет придерживаться стандартов по именованию классов для ядра WordPress.

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

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

Пространства имен

В функциональном программировании мы, по существу, используем псевдопространства имен в виде уникального слага для наших функций. Уникальный префикс – не самый идеальный способ справиться с фатальной ошибкой, которая возникает, когда два плагина, две темы или две библиотеки добавляют функции с тем же самым именем. Эта практика распространяется также на именование классов, когда пространства имен не используются.

Если вы обращаетесь к пространству имен, вы можете использовать короткие дескриптивные имена для ваших классов, поскольку пространства имен работают как уникальные слаги для функций, позволяя избежать конфликтов имен. Пространства имен также позволяют дескриптивно организовать ваши классы и, в случае следования стандарту PSR-4 (и его предшественникам), вашу файловую структуру.

В случае с поддержкой стандарта PSR-4 имя класса и имя файла должны быть одинаковыми. Вместо использования классов вида slug_crud и slug_api, мы можем реализовать классы с именами crud и api в пространстве имен slug.

В дополнение к этому, пространство имен должно совпадать с именем файла. Поскольку пространства имен могут быть вложенными, как и директории, они отражают вашу структуру каталогов. Таким образом, вы можете создавать многочисленные простые классы в пространствах имен в вашем корневом пространстве. К примеру, вы можете создать пространство имен api вместо класса api, и в этом пространстве имен задать уже многочисленные классы. Их полное пространство имен было бы следующим: slug/api.

Таким образом, класс в пространстве имен slug/api, названный authenticate, находился бы в файле authenticate.php, и располагался бы в директории api. Вот как может выглядеть класс:

<?php
namespace slug/api;
 
class authenticate {
	public static function check() {
		//do stuff
	
	}
 }
?>

Мы можем использовать метод check этого класса за пределами класса. К примеру:

/slug/api/authenticate::check();

В классе мы можем использовать метод стандартным способом.

Интересное замечание по поводу стандарта PSR-4: корневое пространство имен не должно находиться в директории с тем же самым именем. Как правило, корневое пространство имен библиотеки находится в каталоге src. Соответственно, главная директория библиотеки просто содержит в себе каталог src, каталог tests, файл composer.json, а также readme. Если ваша библиотека является плагином, вам также понадобится поместить в главную директорию файл с заголовком плагина. Этот файл – отличное место для инициализации вашего автозагрузчика, о чем я поговорю в следующем разделе.

Автозагрузчики

Автозагрузчики классов загружают за вас все файлы, содержащие классы, т.е. вам не нужно волноваться по поводу включения этих файлов. Использовать автозагрузчики достаточно просто, и они создают должное разделение труда между машиной и людьми, когда люди пишут креативный код, а машины выполняют скучную, однообразную и рутинную работу.

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

Мне нравится подключать автозагрузчик к функции, подцепленной к plugins_loaded, которая использует простой цикл для загрузки массива библиотек. Также она автоматически включает файл functions.php, если он существует в корневой директории пространства имен.

Цикл использует простой массив «library_name» => «namespace», либо «library_name» => false, если пространство имен и имя библиотеки являются одинаковыми. Вот пример того, как работает автозагрузчик:

<?php
add_action( 'plugins_loaded',
	function() {
		$class_dir = HSYNCC_PATH.'classes';
		include( $class_dir . '/jp_auto_loader/src/jp_auto_loader.php' );
		$libraries = array(
			'jp_keyed_request' => false,
			'hsync' => false,
			'jp_keyed_request_cye_save' => 'jp_keyed_request\cye_save'
		);
 
 
		$classLoader = new JP_Auto_Loader();
		foreach ( $libraries as $lib => $namespace ) {
			$root = $class_dir . '/'. $lib .'/src';
 
			if ( ! $namespace ) {
				$namespace = $lib;
			}
 
			$classLoader->addNamespace( $namespace, untrailingslashit( $root ) );
			if ( file_exists( $root . '/functions.php' ) ) {
				include( $root . '/functions.php' );
			}
 
		}
 
		$classLoader->register();
 
	}, 3
 
);

Самая важная строка здесь – это «$classLoader->addNamespace( $namespace, untrailingslashit( $root ) );». Эта строка говорит автозагрузчику о том, что «это пространство имен расположено здесь». Если вы имеете только одно пространство имен в вашей библиотеке, то в таком случае вам кроме данной строки больше ничего и не понадобится, за исключением инициализации класса и последней строки $classLoader->register();.

Заключение

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

Источник: http://torquemag.io

Поделиться

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Получать новые комментарии по электронной почте. Вы можете подписаться без комментирования.