Code review в PHP: что проверять и как давать обратную связь
Code review — это не просто формальность, а мощный инструмент для роста команды и повышения качества кода. Для начинающих PHP-разработчиков процесс ревью часто кажется пугающим: «А вдруг я пропущу баг?», «Как сказать коллеге, что его код плохой?». В этой статье мы разберем, на что обращать внимание при проверке PHP-кода и как давать обратную связь, чтобы она была полезной, а не обидной.
1. Что проверять в PHP-коде: чек-лист для начинающего ревьюера
Начнем с технической стороны. Вот основные категории, которые стоит проверять при code review PHP-проекта:
- Безопасность (Security) — самая критичная зона. Проверьте, нет ли SQL-инъекций, XSS-уязвимостей, незащищенных входных данных.
- Соответствие стандартам кодирования — PSR-1, PSR-12 (или стандарты вашей команды). Это читаемость и единообразие.
- Производительность — избегайте излишних запросов к БД, неоптимальных циклов, тяжелых операций внутри циклов.
- Архитектура и логика — соблюдение принципов SOLID, DRY, KISS. Не дублируется ли код? Не слишком ли сложна логика?
- Обработка ошибок — есть ли try-catch? Корректно ли логируются исключения? Не подавляются ли ошибки?
- Типизация и строгость — использует ли код strict_types? Правильно ли указаны типы аргументов и возвращаемых значений?
Вот пример плохого и хорошего кода с точки зрения безопасности:
<?php
// ПЛОХО: уязвимость к SQL-инъекции
$query = "SELECT * FROM users WHERE id = " . $_GET['id'];
$result = mysqli_query($conn, $query);
// ХОРОШО: использование подготовленных запросов
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$id = (int)$_GET['id'];
$stmt->execute();
$result = $stmt->get_result();
?>
2. Как давать обратную связь: принципы конструктивного ревью
Техническая часть — это половина дела. Вторая половина — это умение донести свои замечания так, чтобы автор кода захотел их исправить, а не обиделся или защищался.
Основные правила обратной связи:
- Говорите о коде, а не о человеке. Вместо «Ты написал ужасный код» скажите «В этом месте есть потенциальная уязвимость, давай обсудим, как её исправить».
- Используйте «Я-сообщения». «Я вижу, что здесь может возникнуть ошибка, потому что...» — это звучит мягче, чем «Ты ошибся».
- Объясняйте «почему». Не просто «Используй prepared statements», а «Prepared statements защищают от SQL-инъекций, потому что отделяют данные от кода запроса».
- Предлагайте альтернативы. Вместо «Это плохо» покажите, как можно сделать лучше.
- Хвалите за хорошее. Не забывайте отмечать удачные решения: «Отличная идея вынести валидацию в отдельный класс!».
Пример конструктивного комментария:
<!-- ПЛОХОЙ комментарий -->
<!-- Почему ты не используешь строгую типизацию? Это же база! -->
<!-- ХОРОШИЙ комментарий -->
<!-- Предлагаю добавить declare(strict_types=1) в начало файла.
Это заставит PHP проверять типы строго и предотвратит случайные
неявные преобразования, которые могут привести к багам. -->
3. Типичные ошибки PHP-кода, которые стоит искать при ревью
Вот список частых проблем, которые встречаются в коде начинающих PHP-разработчиков. Обратите на них особое внимание:
- Отсутствие валидации входных данных. Никогда не доверяйте $_GET, $_POST, $_REQUEST, $_FILES.
- Глобальные переменные и суперглобальные массивы внутри функций. Это нарушает инкапсуляцию и усложняет тестирование.
- Смешивание логики и представления. PHP-код не должен быть вперемешку с HTML. Используйте шаблонизаторы (Twig, Blade) или хотя бы отделяйте логику.
- Отсутствие обработки ошибок. Если код может выбросить исключение, его нужно ловить и обрабатывать (логировать, показывать пользователю понятное сообщение).
- Неоптимальные запросы к БД. N+1 проблема — когда в цикле выполняются отдельные запросы для каждой записи. Используйте JOIN или eager loading.
- Жестко закодированные значения (magic numbers). Вместо
if ($status == 3)используйте константы:if ($status === Status::ACTIVE).
Пример проблемы N+1 и её решения:
<?php
// ПЛОХО: N+1 запросов
$users = $db->query("SELECT * FROM users");
foreach ($users as $user) {
$posts = $db->query("SELECT * FROM posts WHERE user_id = " . $user['id']);
// ... обрабатываем посты
}
// ХОРОШО: один запрос с JOIN
$usersWithPosts = $db->query("
SELECT u.*, p.title AS post_title
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
");
// или используем ORM с жадной загрузкой (eager loading)
?>
4. Практические советы: как организовать процесс code review в команде
Чтобы ревью приносило пользу, а не превращалось в бюрократию, следуйте этим рекомендациям:
- Не ревьюйте слишком большие изменения. Чем больше diff, тем выше вероятность пропустить ошибку. Оптимальный размер — 200-400 строк кода на одно ревью.
- Используйте автоматические инструменты. PHPStan, Psalm, PHP