1 added
1 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Ключевая программа в экосистеме PHP - это Composer. Она выполняет так много функций, что мы не сможем рассмотреть всё в рамках этого курса. Мы советуем периодически просматривать ее команды и изучать информацию по ним. Основная задача, которую решает Composer -<strong>управление зависимостями</strong>. Именно о нем мы поговорим в этом уроке.</p>
1
<p>Ключевая программа в экосистеме PHP - это Composer. Она выполняет так много функций, что мы не сможем рассмотреть всё в рамках этого курса. Мы советуем периодически просматривать ее команды и изучать информацию по ним. Основная задача, которую решает Composer -<strong>управление зависимостями</strong>. Именно о нем мы поговорим в этом уроке.</p>
2
<p>Чтобы установить Composer, изучите официальное руководство для<a>Windows</a>и<a>Linux</a>. На MacOS все немного проще - Composer устанавливается через Homebrew командой brew install composer.</p>
2
<p>Чтобы установить Composer, изучите официальное руководство для<a>Windows</a>и<a>Linux</a>. На MacOS все немного проще - Composer устанавливается через Homebrew командой brew install composer.</p>
3
<p>Для успешной установки и настройки Composer нужно немного разбираться в работе с командными интерпретаторами. Рекомендуем пройти<a>соответствующий курс на Хекслете</a>, если вы этого еще не сделали.</p>
3
<p>Для успешной установки и настройки Composer нужно немного разбираться в работе с командными интерпретаторами. Рекомендуем пройти<a>соответствующий курс на Хекслете</a>, если вы этого еще не сделали.</p>
4
<p>Кроме самого Composer, установите следующие программы, используя пакетный менеджер вашей операционной системы:</p>
4
<p>Кроме самого Composer, установите следующие программы, используя пакетный менеджер вашей операционной системы:</p>
5
<ul><li><a>git</a></li>
5
<ul><li><a>git</a></li>
6
<li><a>curl</a></li>
6
<li><a>curl</a></li>
7
</ul><p>Убедитесь, что Composer работает:</p>
7
</ul><p>Убедитесь, что Composer работает:</p>
8
<p>Запуск Composer без аргументов выведет весь список доступных команд с их описанием. Пробегитесь по ним, чтобы сформировать первое впечатление.</p>
8
<p>Запуск Composer без аргументов выведет весь список доступных команд с их описанием. Пробегитесь по ним, чтобы сформировать первое впечатление.</p>
9
<p>Почти с зарождения программирования появилась идея повторно использовать код не только в рамках одного проекта, но и в других проектах. Например, во всех проектах используются одни и те же функции для работы с датами, математическими формулами и расчетами. Такое переиспользование привело к росту производительности - современные программисты могут сосредоточиться на решении уникальных задач бизнеса, не тратя время на изобретение велосипеда под инфраструктурные задачи. Работать стало еще проще, когда появились Git и GitHub.</p>
9
<p>Почти с зарождения программирования появилась идея повторно использовать код не только в рамках одного проекта, но и в других проектах. Например, во всех проектах используются одни и те же функции для работы с датами, математическими формулами и расчетами. Такое переиспользование привело к росту производительности - современные программисты могут сосредоточиться на решении уникальных задач бизнеса, не тратя время на изобретение велосипеда под инфраструктурные задачи. Работать стало еще проще, когда появились Git и GitHub.</p>
10
<p>Первоначально общий код выносился в файлы, которые программисты держали на своих компьютерах и копировали из проекта в проект. У такого способа есть ряд существенных недостатков:</p>
10
<p>Первоначально общий код выносился в файлы, которые программисты держали на своих компьютерах и копировали из проекта в проект. У такого способа есть ряд существенных недостатков:</p>
11
<ol><li>Код сложно передать другим</li>
11
<ol><li>Код сложно передать другим</li>
12
<li>У разных программистов хранятся разные копии одних и тех же решений</li>
12
<li>У разных программистов хранятся разные копии одних и тех же решений</li>
13
<li>Доработкой кода занимается только его автор</li>
13
<li>Доработкой кода занимается только его автор</li>
14
<li>В сумме много разных копий без возможности быстрого обновления</li>
14
<li>В сумме много разных копий без возможности быстрого обновления</li>
15
<li>Код копируется прямо в другой проект, поэтому он модифицируется и становится специфичным</li>
15
<li>Код копируется прямо в другой проект, поэтому он модифицируется и становится специфичным</li>
16
</ol><p>Git автоматически решает часть этих проблем. С его помощью можно создавать наборы общих файлов - библиотеки. Потом в конечных проектах можно использовать такие библиотеки причем как написанные нами, так и сторонними разработчиками.</p>
16
</ol><p>Git автоматически решает часть этих проблем. С его помощью можно создавать наборы общих файлов - библиотеки. Потом в конечных проектах можно использовать такие библиотеки причем как написанные нами, так и сторонними разработчиками.</p>
17
<p>Но тут возникает новая сложность - когда библиотек становится много, у них появляется общий код более низкого уровня. Например, финансовые библиотеки могут использовать функции для преобразования валют. Чтобы подобный код не дублировался, хочется его вынести в общее место. Этот процесс может продолжаться бесконечно. Одни библиотеки зависят от других, которые зависят от третьих и так далее.</p>
17
<p>Но тут возникает новая сложность - когда библиотек становится много, у них появляется общий код более низкого уровня. Например, финансовые библиотеки могут использовать функции для преобразования валют. Чтобы подобный код не дублировался, хочется его вынести в общее место. Этот процесс может продолжаться бесконечно. Одни библиотеки зависят от других, которые зависят от третьих и так далее.</p>
18
<p>С точки зрения переиспользования кода все хорошо - большое число маленьких библиотек решают всевозможные задачи, что позволяет быстро двигаться вперед. Но с точки зрения управления, появляются проблемы:</p>
18
<p>С точки зрения переиспользования кода все хорошо - большое число маленьких библиотек решают всевозможные задачи, что позволяет быстро двигаться вперед. Но с точки зрения управления, появляются проблемы:</p>
19
<ol><li>Нужно вводить понятие "версия", потому что библиотеки начинают зависеть не только друг от друга, но и от версий друг друга. Для примера представим, что в новой версии библиотеки ее автор изменил параметры функций - это ломает обратную совместимость. В такой ситуации можно обновить вторую библиотеку, но тогда первая перестанет работать. Она рассчитывала на одно поведение зависимой библиотеки, а получила - другое.</li>
19
<ol><li>Нужно вводить понятие "версия", потому что библиотеки начинают зависеть не только друг от друга, но и от версий друг друга. Для примера представим, что в новой версии библиотеки ее автор изменил параметры функций - это ломает обратную совместимость. В такой ситуации можно обновить вторую библиотеку, но тогда первая перестанет работать. Она рассчитывала на одно поведение зависимой библиотеки, а получила - другое.</li>
20
<li>Нужно стандартизировать способ создания библиотек, чтобы автоматизировать их соединение. Типичный веб-проект может зависеть от сотни библиотек, которые в свою очередь зависят от других библиотек. Общее число зависимостей может легко перевалить за тысячу - вручную управлять таким зоопарком невозможно.</li>
20
<li>Нужно стандартизировать способ создания библиотек, чтобы автоматизировать их соединение. Типичный веб-проект может зависеть от сотни библиотек, которые в свою очередь зависят от других библиотек. Общее число зависимостей может легко перевалить за тысячу - вручную управлять таким зоопарком невозможно.</li>
21
<li>Из-за проблемы выше нужно автоматизированное средство управления зависимостями - для их обновления, установки и удаления.</li>
21
<li>Из-за проблемы выше нужно автоматизированное средство управления зависимостями - для их обновления, установки и удаления.</li>
22
</ol><p>Всеми этими вопросами занимаются<strong>пакетные менеджеры</strong>. Обычно пакетный менеджер поставляется вместе с языком программирования, потому что сложно представить себе современный код без единой зависимости.</p>
22
</ol><p>Всеми этими вопросами занимаются<strong>пакетные менеджеры</strong>. Обычно пакетный менеджер поставляется вместе с языком программирования, потому что сложно представить себе современный код без единой зависимости.</p>
23
<h2>Терминология</h2>
23
<h2>Терминология</h2>
24
<p>В PHP есть два важных понятия:</p>
24
<p>В PHP есть два важных понятия:</p>
25
<ul><li><strong>Пакет</strong>- это та самая библиотека, которую мы пишем или используем в проекте как зависимость</li>
25
<ul><li><strong>Пакет</strong>- это та самая библиотека, которую мы пишем или используем в проекте как зависимость</li>
26
<li><strong>Репозиторий</strong>- это хранилище пакетов PHP, которое называется<a>Packagist</a>. Любой пользователь может за пару минут опубликовать пакет в Packagist, а все остальные смогут его использовать. Сейчас в хранилище больше трехсот тысяч пакетов, и их количество растет. Обычно исходный код пакетов хранится на GitHub, но это не обязательно.</li>
26
<li><strong>Репозиторий</strong>- это хранилище пакетов PHP, которое называется<a>Packagist</a>. Любой пользователь может за пару минут опубликовать пакет в Packagist, а все остальные смогут его использовать. Сейчас в хранилище больше трехсот тысяч пакетов, и их количество растет. Обычно исходный код пакетов хранится на GitHub, но это не обязательно.</li>
27
</ul><h2>Глобальная установка пакетов</h2>
27
</ul><h2>Глобальная установка пакетов</h2>
28
<p>Многие пакеты в PHP - это законченные программы. Их можно установить и запустить как обычную утилиту командной строки. Эти пакеты ставятся в системные директории и не связаны с конкретным проектом.</p>
28
<p>Многие пакеты в PHP - это законченные программы. Их можно установить и запустить как обычную утилиту командной строки. Эти пакеты ставятся в системные директории и не связаны с конкретным проектом.</p>
29
<p>Попробуем установить утилиту phpcs, которая анализирует код на соответствие стандартам. Инструкция по установке подобных пакетов обычно есть на странице<a>репозитория</a>на GitHub:</p>
29
<p>Попробуем установить утилиту phpcs, которая анализирует код на соответствие стандартам. Инструкция по установке подобных пакетов обычно есть на странице<a>репозитория</a>на GitHub:</p>
30
<ul><li>Здесь<em>global</em>означает, что установка глобальная, то есть пакет ставится в операционную систему как обычная программа</li>
30
<ul><li>Здесь<em>global</em>означает, что установка глобальная, то есть пакет ставится в операционную систему как обычная программа</li>
31
<li>Чтобы командный интерпретатор увидел программу, установленную глобально, нужно правильно настроить переменную окружения $PATH, добавив в нее путь к исполняемым файлам Composer. Его можно узнать, выполнив в терминале команду composer global config bin-dir</li>
31
<li>Чтобы командный интерпретатор увидел программу, установленную глобально, нужно правильно настроить переменную окружения $PATH, добавив в нее путь к исполняемым файлам Composer. Его можно узнать, выполнив в терминале команду composer global config bin-dir</li>
32
-
</ul><p>Установка занимает некоторое время, в течение которого видно, как скачивается сам пакет и его зависимости. Дальше ничего делать не нужно - phpcs создан утил��той командной строки, он сразу готов к использованию:</p>
32
+
</ul><p>Установка занимает некоторое время, в течение которого видно, как скачивается сам пакет и его зависимости. Дальше ничего делать не нужно - phpcs создан утилитой командной строки, он сразу готов к использованию:</p>
33
<p>Если что-то пошло не так, убедитесь, что вы все правильно настроили:</p>
33
<p>Если что-то пошло не так, убедитесь, что вы все правильно настроили:</p>
34
<ul><li><p>Изучите вывод echo $PATH и поищите, есть ли там путь до исполняемых файлов Composer:</p>
34
<ul><li><p>Изучите вывод echo $PATH и поищите, есть ли там путь до исполняемых файлов Composer:</p>
35
</li>
35
</li>
36
<li><p>С помощью команды which phpcs проверьте, все ли установилось:</p>
36
<li><p>С помощью команды which phpcs проверьте, все ли установилось:</p>
37
</li>
37
</li>
38
</ul><h2>Ошибки</h2>
38
</ul><h2>Ошибки</h2>
39
<p>Во время установки пакетов Composer может ругаться на различные ошибки. Например, так:</p>
39
<p>Во время установки пакетов Composer может ругаться на различные ошибки. Например, так:</p>
40
<p>Эти ошибки говорят нам, что устанавливаемые библиотеки хотят использовать PHP-расширение, которое не установлено в систему. Это прямо написано в выводе:</p>
40
<p>Эти ошибки говорят нам, что устанавливаемые библиотеки хотят использовать PHP-расширение, которое не установлено в систему. Это прямо написано в выводе:</p>
41
<blockquote><p><em>requires ext-dom * -> the requested PHP extension dom is missing from your system</em></p>
41
<blockquote><p><em>requires ext-dom * -> the requested PHP extension dom is missing from your system</em></p>
42
</blockquote><p>Когда вы встречаете такую ошибку, то первым делом нужно посмотреть на название расширения. Здесь это<em>dom</em>. Затем нужно поискать инструкцию, которая объяснит, как установить это расширение в вашу операционную систему. Проще всего это сделать таким запросом:<em>php <название операционной системы> <название расширения> install extension</em>.</p>
42
</blockquote><p>Когда вы встречаете такую ошибку, то первым делом нужно посмотреть на название расширения. Здесь это<em>dom</em>. Затем нужно поискать инструкцию, которая объяснит, как установить это расширение в вашу операционную систему. Проще всего это сделать таким запросом:<em>php <название операционной системы> <название расширения> install extension</em>.</p>
43
<h2>Проект</h2>
43
<h2>Проект</h2>
44
<p>Composer - это универсальный способ описывать любой код на PHP, который подходит для работы и с библиотекой, и с полноценным сайтом. В любом случае внутри будет Composer. Фактически любой новый проект начинается не с написания кода, а с инициализации Composer. Для этого нужно запустить команду init. Она задаст несколько вопросов и на основе ваших ответов сформирует файл<em>composer.json</em>.</p>
44
<p>Composer - это универсальный способ описывать любой код на PHP, который подходит для работы и с библиотекой, и с полноценным сайтом. В любом случае внутри будет Composer. Фактически любой новый проект начинается не с написания кода, а с инициализации Composer. Для этого нужно запустить команду init. Она задаст несколько вопросов и на основе ваших ответов сформирует файл<em>composer.json</em>.</p>
45
<p>Если вы не понимаете значение некоторых вопросов, смело жмите Enter - потом все можно будет поправить:</p>
45
<p>Если вы не понимаете значение некоторых вопросов, смело жмите Enter - потом все можно будет поправить:</p>
46
<p>Когда вопросы закончатся, Composer покажет конечный результат в виде<a>JSON</a>- это текстовый формат для представления структурированных данных. Если вы не знакомы с ним, это не критично. Достаточно выучить несколько правил формирования данных в виде JSON, чтобы чувствовать себя комфортно:</p>
46
<p>Когда вопросы закончатся, Composer покажет конечный результат в виде<a>JSON</a>- это текстовый формат для представления структурированных данных. Если вы не знакомы с ним, это не критично. Достаточно выучить несколько правил формирования данных в виде JSON, чтобы чувствовать себя комфортно:</p>
47
<p>Если вас все устраивает, то Composer создаст файл<em>composer.json</em>. Именно этот файл является ключевым. В нем описывается абсолютно все, что касается зависимостей. С этого момента все команды<em>composer</em>, непосредственно связанные с проектом, выполняются именно в той директории, в которой находится файл<em>composer.json</em>.</p>
47
<p>Если вас все устраивает, то Composer создаст файл<em>composer.json</em>. Именно этот файл является ключевым. В нем описывается абсолютно все, что касается зависимостей. С этого момента все команды<em>composer</em>, непосредственно связанные с проектом, выполняются именно в той директории, в которой находится файл<em>composer.json</em>.</p>
48
<p>Имя пакета в<em>composer.json</em>, состоит из двух частей:</p>
48
<p>Имя пакета в<em>composer.json</em>, состоит из двух частей:</p>
49
<ul><li><em>vendor name</em>- имя, под которым вы зарегистрированы в Packagist</li>
49
<ul><li><em>vendor name</em>- имя, под которым вы зарегистрированы в Packagist</li>
50
<li><em>project name</em></li>
50
<li><em>project name</em></li>
51
</ul><p>Причем<em>vendor name</em>уникален глобально, то есть все пользователи имеют свое собственное неповторимое имя, а вот<em>project name</em>должен быть уникален только в пределах<em>vendor name</em>.</p>
51
</ul><p>Причем<em>vendor name</em>уникален глобально, то есть все пользователи имеют свое собственное неповторимое имя, а вот<em>project name</em>должен быть уникален только в пределах<em>vendor name</em>.</p>
52
<p>Composer рекомендует именовать пакет словами в нижнем регистре и в качестве разделителя использовать дефис: например,<em>dependency-injection</em>.</p>
52
<p>Composer рекомендует именовать пакет словами в нижнем регистре и в качестве разделителя использовать дефис: например,<em>dependency-injection</em>.</p>
53
<h2>Проблемы</h2>
53
<h2>Проблемы</h2>
54
<p>Иногда в файле<em>composer.json</em>содержатся синтаксические ошибки - нарушения правила форматирования JSON. В таком случае при попытке сделать что-то с проектом будут появляться подобные ошибки:</p>
54
<p>Иногда в файле<em>composer.json</em>содержатся синтаксические ошибки - нарушения правила форматирования JSON. В таком случае при попытке сделать что-то с проектом будут появляться подобные ошибки:</p>
55
<p>Обычно любые сообщения с неожиданными символами или строками говорят о синтаксической ошибке.</p>
55
<p>Обычно любые сообщения с неожиданными символами или строками говорят о синтаксической ошибке.</p>
56
<p>Воспользуйтесь валидаторами JSON для проверки корректности своего файла. Например, для этого подходит<a>jsonlint.com</a>и другие подобные инструменты, которые можно найти по запросу<em>json validator</em>.</p>
56
<p>Воспользуйтесь валидаторами JSON для проверки корректности своего файла. Например, для этого подходит<a>jsonlint.com</a>и другие подобные инструменты, которые можно найти по запросу<em>json validator</em>.</p>
57
57