Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Качество кода

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

Стандарт PSR-12

PSR-12 — договорённость сообщества о том, как оформлять код на PHP. Главные правила:

ПравилоПример
Отступ — 4 пробелаНе табуляция
Имена классов — PascalCaseOrderService
Имена методов и переменных — camelCasegetTotal(), $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 и требовать чистоты только от нового кода.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.