Верх страницы
Обложка к записи Как переопределять РНР классы через Composer
Время для прочтения: 0 мин. 32 сек.

Как переопределять РНР классы через Composer

В этом руководстве мы рассмотрим, как переопределять классы с помощью Composer.

Если вы работаете с PHP, возможно, используете Laravel или другой фреймворк, в этом руководстве мы рассмотрим, как переопределять классы с помощью Composer.

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

Необходимые условия

Этот туториал предполагает, что у вас уже есть проект, использующий Composer, а значит, есть файл composer.json.

Но в начале о PSR-4

PSR расшифровывается как PHP Standard Recommendation. PSR-4 определяет стандарты для пространств имен, имен классов и т.д.

Допустим, у вас в проекте следующая файловая структура:

- app
|
|_ _ _ Model
	  |
	  |_ _ User.php

Это похоже на структуру, которую вы имеете при использовании Laravel. Стандарты PSR-4 говорят, что пространство имен должно быть точно таким же, как и структура файлов. Так, внутри User.php пространство имен должно быть app/Model.

Однако, когда мы используем Laravel, мы всегда пишем app с большой буквы, поэтому пространство имен будет App\Model. Как это не нарушает стандарт?

Это происходит благодаря следующим строкам в composer.json:

"autoload": {
	"psr-4": {
		"App\\": "app/",
        //....
	}
}

Итак, как это работает?

Автозагрузка в Composer

Используя ключ autoload, мы можем указать, как загружать определенные файлы на основе спецификации, которой в данном случае является PSR-4.

Итак, сначала мы добавим ключ autoload, который представляет собой объект с ключом psr-4:

"autoload": {
	"psr-4": {
    }
}

Внутри объекта psr-4 у нас будут пары ключ-значение, которые определяют, как файлы должны быть загружены. Ключом будет пространство имен, которое будет загружено, а значением — место, откуда оно должно быть загружено. Так, в примере с Laravel, пространство имен App\ является ключом, а app/ — значением. Это означает, что все пространства имен App\ должны быть загружены из каталога app.

Переопределение классов

Допустим, у нас есть класс Vendor\Model\User, и мы хотим переопределить этот класс. Во-первых, класс, который его переопределяет, должен находиться в определенной директории. Так, вы можете создать пустую папку app/overrides, чтобы поместить в неё переопределяемые классы. Это может быть любой путь, который вы хотите, это не имеет значения.

Допустим, мы создали app/overrides/User.php и хотим, чтобы этот класс переопределял Vendor/Model/User. Первый шаг — мы должны убедиться, что app/overrides/User.php имеет то же пространство имен:

namespace Vendor/Model;

Затем вы можете разместить любой код внутри класса.

Далее нам нужно сообщить Composer, откуда загружать пространство имен Vendor/Model. Итак, ключ здесь должен быть Vendor/Model, а значение — путь к директории, в которой находится переопределяющий класс, в нашем случае это app/overrides:

"autoload": {
	"psr-4": {
    	"Vendor\\Model\\": "app/overrides"
    }
}

Вот и все. Теперь автозагрузка для Vendor/Model будет происходить из app/overrides, а не из первоначального места, и таким образом вы сможете переопределить любой класс, который захотите.

Дополнительные опции

Вместо значения в виде строки, содержащей путь, по которому должно быть загружено пространство имен, вы можете указать массив. Это говорит Composer, что он должен искать классы в нескольких местах:

"Vendor\\Model\\": ["app/overrides", "src"]

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

"autoload": {
	"psr-4": {
    	"": "app/overides/"
    }
}

Источник: How to Override Classes in PHP and Composer.

Автор: Кобзарёв Михаил

Русский разработчик с 20-ти летним стажем. Работаю с PHP, ООП, JavaScript, Git, WordPress, Битрикс, Joomla, Drupal, OpenCart, DLE, Laravel, Moonshine, Symfony, SuiteCRM.

Оптимизирую сайты под Google Page Speed, настраиваю импорты для больших магазинов на WooCommerce + WP All Import. Пишу плагины на заказ. Все мои услуги.

Веду блог о разработке, дайджест в телеграмме и в ВК.

Вы всегда можете нанять меня.

Комментарии
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Предыдущая запись

Давайте дружить
в Telegram

Авторский блог вашего покорного слуги в Telegram про web, программирование, алгоритмы, инструменты разработчика, WordPress, Joomla, Opencart, Laravel, Moonshine, фильмы и сериалы