PHP: Пакеты

По мере роста программы увеличивается не только количество строк кода, но и количество файлов. Кроме того, удобный код хочется переиспользовать в разных проектах, а не копировать из одного в другой.

В Python для группировки модулей используют пакеты-директории. В экосистеме PHP единицей переиспользования и распространения служит пакет (Composer-пакет). Пакет — это набор PHP-файлов с функциями и классами, который публикуют и устанавливают целиком.

Composer

Пакетами управляет Composer — менеджер пакетов PHP. Проект описывает свои зависимости в файле composer.json:

{
    "name": "hexlet-basics/exercises-php",
    "require": {
        "php": "^8.4",
        "nesbot/carbon": "^3.0"
    }
}

Команда composer install скачивает все перечисленные пакеты и складывает их в директорию vendor/. Добавить новый пакет можно командой composer require, например:

composer require nesbot/carbon

Имя пакета

Имя пакета состоит из двух частей, разделенных слешем: nesbot/carbon. Первая часть — имя издателя (vendor), вторая — имя самого пакета. Такая схема решает конфликты имен: разные разработчики могут опубликовать пакеты с одинаковым названием, и они не будут мешать друг другу — точно так же, как пространства имен позволяют существовать одинаковым функциям.

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

Установленные пакеты попадают в директорию vendor/, но подключать каждый файл вручную через require не нужно. Composer генерирует специальный файл-автозагрузчик, и одной строки достаточно, чтобы стали доступны все установленные пакеты:

<?php

require __DIR__ . '/vendor/autoload.php';

// Дальше можно использовать функции и классы
// из любого установленного пакета

Этот механизм называется автозагрузкой (autoloading). Именно так устроены реальные PHP-проекты: в начале программы подключается автозагрузчик, а дальше код просто использует то, что нужно.

Реестр Packagist

Пакеты не пишут с нуля под каждую задачу — основным источником служит реестр Packagist, где опубликованы сотни тысяч готовых пакетов: для работы с датами, сетью, тестами и почти любой другой задачей. Например, PHPUnit, который проверяет ваши решения в этом курсе, — тоже Composer-пакет.

Особняком стоит стандартная библиотека PHP. Встроенные функции, такие как strlen(), round() или rand(), не нужно устанавливать — они поставляются вместе с самим языком и доступны сразу, без Composer и автозагрузки.

Задание

Реализуйте функцию generatePin(). Она возвращает случайный четырехзначный PIN-код в виде строки.

Каждый разряд PIN-кода — независимое случайное целое число от 0 до 9.

<?php

print_r(generatePin()); // => например, "4823" или "0571"
print_r(generatePin()); // => например, "1942" или "0037"

Укажите объявление типа возвращаемого значения.

Подсказка

Сгенерируйте каждую из четырех цифр через rand(0, 9) и соберите строку через интерполяцию.

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются