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) и соберите строку через интерполяцию.
Полезное
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) и соберите строку через интерполяцию.
Полезное
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\DefineFunctions\Packages;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$reflection = new \ReflectionFunction(__NAMESPACE__ . '\generatePin');
$this->assertEquals('string', $reflection->getReturnType()?->getName(), 'You should add a return type declaration!');
foreach ([1, 7, 42] as $seed) {
srand($seed);
$result = generatePin();
srand($seed);
$expected = sprintf('%d%d%d%d', rand(0, 9), rand(0, 9), rand(0, 9), rand(0, 9));
$this->assertSame($expected, $result);
$this->assertSame(4, strlen($result));
}
}
}Решение учителя откроется через:
20:00
