Качество кода
Код читают чаще, чем пишут. Когда весь проект оформлен одинаково, а очевидные ошибки находит программа, работать с ним легче и одному, и в команде. Для этого есть общий стандарт оформления и инструменты, которые следят за ним сами.
Стандарт PSR-12
PSR-12 — договорённость сообщества о том, как оформлять код на PHP. Главные правила:
| Правило | Пример |
|---|---|
| Отступ — 4 пробела | Не табуляция |
Имена классов — PascalCase | OrderService |
Имена методов и переменных — camelCase | getTotal(), $orderId |
| Константы — заглавными буквами | MAX_ITEMS |
| Скобка класса и метода — на новой строке | См. ниже |
Скобка if, for, foreach — на той же строке | См. ниже |
| Один класс — один файл | src/OrderService.php |
<?php
declare(strict_types=1);
class OrderService
{
private const MAX_ITEMS = 10;
public function canAdd(int $count): bool
{
if ($count >= self::MAX_ITEMS) {
return false;
}
return true;
}
}
echo (new OrderService())->canAdd(3) ? 'можно' : 'нельзя'; // можноАвтоматическое форматирование
Следить за оформлением вручную не нужно — это делает PHP-CS-Fixer:
composer require --dev friendsofphp/php-cs-fixer
vendor/bin/php-cs-fixer fix srcКоманда сама расставит отступы, пробелы и скобки во всех файлах папки src.
Статический анализ
Статический анализатор читает код, не запуская его, и находит ошибки, которые иначе проявились бы только у посетителя. Самый известный — PHPStan:
composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse src --level=5Уровней десять — от самых грубых ошибок до очень строгих проверок. Начинают с низкого и постепенно повышают.
Что находит анализатор
<?php
function findUser(int $id): ?array
{
return $id === 1 ? ['name' => 'Анна'] : null;
}
$user = findUser(2);
echo $user['name'] ?? 'не найден'; // не найденБез оператора ?? строка echo $user['name'] выполнилась бы с предупреждением, как только пользователь не найдётся. PHPStan заметит это заранее: функция может вернуть null, а код этого не учитывает. Так же он находит вызовы несуществующих методов, неверные типы аргументов и недостижимый код.
Подсказки для анализатора
Чем точнее типы, тем больше ошибок видит анализатор. То, что нельзя выразить типом PHP, пишут в комментарии:
<?php
/**
* @param array<int, string> $names
* @return array<string, int>
*/
function countLetters(array $names): array
{
$result = [];
foreach ($names as $name) {
$result[$name] = mb_strlen($name);
}
return $result;
}
echo json_encode(countLetters(['Анна', 'Пётр']), JSON_UNESCAPED_UNICODE); // {"Анна":4,"Пётр":4}Команды Composer
Чтобы не помнить длинные команды, их записывают в composer.json:
{
"scripts": {
"format": "php-cs-fixer fix src",
"analyse": "phpstan analyse src --level=5",
"test": "phpunit",
"check": ["@format", "@analyse", "@test"]
}
}composer checkОдна команда форматирует код, проверяет его и запускает тесты. Её выполняют перед каждой отправкой изменений.
Частая ошибка
Включить анализатор на высоком уровне в старом проекте и получить тысячи замечаний — верный способ его забросить. Начните с уровня 0 или 1, исправьте найденное, затем поднимайте уровень. Для большого старого кода PHPStan умеет запомнить существующие замечания в файле baseline и требовать чистоты только от нового кода.