Почему без библиотек PHP — это велосипед с квадратными колесами
Давайте честно: писать на чистом PHP без сторонних библиотек — это как строить дом, обжигая каждый кирпич вручную. Можно, но зачем? Экосистема PHP за последние 10 лет превратилась в мощнейший арсенал инструментов, которые экономят часы (а иногда и дни) разработки. Сегодня мы разберем популярные PHP библиотеки, без которых не обходится ни один серьезный проект.
Я покажу не просто список — мы пройдемся по каждой библиотеке с реальными примерами кода, узнаем, где их применять, и поймем, как они решают типичные боли разработчика. Если вы пишете на PHP и до сих пор не используете Composer — эта статья для вас. Поехали!
Composer: фундамент всей экосистемы
Прежде чем говорить о конкретных пакетах, нужно сказать спасибо Composer. Это не просто менеджер зависимостей — это нервная система современной PHP-разработки. Без него установка любой библиотеки превращается в ад: скачать архив, распаковать, подключить вручную, молиться, чтобы не было конфликтов версий.
Установка библиотек через Composer выглядит так:
composer require vendor/package-name
И всё. Composer сам подтянет зависимости, создаст автозагрузку и пропишет всё в composer.json. Например, чтобы установить Guzzle, достаточно одной команды:
composer require guzzlehttp/guzzle
Теперь, когда мы разобрались с базой, давайте посмотрим на лучшие PHP библиотеки, которые реально делают код чище, быстрее и безопаснее.
Guzzle: король HTTP-запросов
Работа с внешними API — хлеб современного веб-разработчика. Отправить POST-запрос, получить JSON, обработать ошибки... Встроенные функции вроде file_get_contents() или curl_* работают, но выглядят как код из 2005 года.
Guzzle — это элегантная PHP библиотека для HTTP-запросов, которая делает работу с REST API настоящим удовольствием. Вот как выглядит типичный GET-запрос:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('GET', 'https://api.github.com/users/pythonlib');
$data = json_decode($response->getBody(), true);
echo "Логин: " . $data['login'] . PHP_EOL;
echo "Репозитории: " . $data['public_repos'];
?>
Видите? Никакого ручного управления cURL, никаких проверок на ошибки в каждом шаге. Guzzle сам обрабатывает таймауты, редиректы и коды ответов. А если нужно отправить POST с заголовками и телом:
<?php
$response = $client->post('https://httpbin.org/post', [
'headers' => [
'Authorization' => 'Bearer my-token',
'Accept' => 'application/json'
],
'json' => [
'name' => 'PHP Library',
'type' => 'article'
]
]);
echo $response->getStatusCode(); // 200
?>
Guzzle поддерживает асинхронные запросы, пулы соединений, middleware и многое другое. Если вы работаете с любым внешним API — это первая библиотека, которую нужно установить.
Monolog: логирование без боли
«Где у меня ошибка?» — вопрос, который разработчик задает себе каждый день. Без нормального логирования вы будете втыкать var_dump() и echo в продакшн-код. Не надо так.
Monolog — стандарт де-факто для логирования в PHP. Он умеет писать логи в файлы, базы данных, Slack, Telegram, email — куда угодно. Самое крутое — вы можете отправлять разные уровни ошибок в разные каналы.
Простой пример — логирование в файл с ротацией:
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\RotatingFileHandler;
// Создаем логгер
$log = new Logger('my_app');
// Пишем всё в один файл (простой вариант)
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Logger::WARNING));
// А так — с ротацией по дням (хранить 30 дней)
$log->pushHandler(new RotatingFileHandler(__DIR__ . '/logs/app.log', 30, Logger::DEBUG));
// Использование
$log->info('Пользователь залогинился', ['user_id' => 42]);
$log->error('База данных упала', ['exception' => $e->getMessage()]);
?>
Обратите внимание на второй аргумент в методах — контекст. Вы всегда можете добавить дополнительные данные, которые потом помогут при отладке. А комбинируя разные хендлеры, можно, например, ошибки отправлять в Telegram, а информационные сообщения — просто в файл.
PHPUnit: тесты, которые спасут ваш сон
Писать без тестов — как играть в русскую рулетку. Может, повезет, а может, в пятницу вечером вы уроните прод. PHPUnit — это стандартная библиотека для тестирования PHP-кода, которую используют в Laravel, Symfony и любом серьезном проекте.
Установка:
composer require --dev phpunit/phpunit
А вот пример простого теста для класса, который считает скидку:
<?php
use PHPUnit\Framework\TestCase;
class DiscountCalculatorTest extends TestCase
{
public function testCalculateWithValidPrice(): void
{
$calculator = new DiscountCalculator();
$result = $calculator->calculate(1000, 10); // 10% скидка
$this->assertEquals(900, $result);
}
public function testCalculateWithZeroDiscount(): void
{
$calculator = new DiscountCalculator();
$result = $calculator->calculate(500, 0);
$this->assertEquals(500, $result);
}
public function testCalculateThrowsExceptionForNegativePrice(): void
{
$this->expectException(\InvalidArgumentException::class);
$calculator = new DiscountCalculator();
$calculator->calculate(-100, 10);
}
}
?>
Запускаете одной командой:
./vendor/bin/phpunit tests/
И вы видите, что всё зелёное. Или красное — с указанием, где именно ошибка. Это дисциплинирует код и заставляет думать о краевых случаях. Поверьте, через месяц вы скажете себе спасибо за каждый написанный тест.
Carbon: работа с датами, которая не бесит
Встроенные функции PHP для работы с датами — date(), strtotime(), DateTime — работают, но их API оставляет желать лучшего. Попробуйте посчитать «первый понедельник следующего месяца» на чистом PHP. Удачи.
Carbon