Оснасти свой код по-профессиональному: тесты PHPUnit, статический анализ PHPStan на уровне 9 и стандарты PSR.
Открыть этот урок в KodokonЭкспертный код узнаётся не столько по хитрым приёмам, сколько по страховочной сетке. Три взаимодополняющие опоры: тесты (PHPUnit), которые проверяют поведение, запуская код, статический анализ (PHPStan), который доказывает свойства кода, ничего не запуская, и общие стандарты (PSR), которые делают экосистему совместимой. Всё ставится через Composer как зависимости для разработки.
composer require --dev phpunit/phpunit
composer require --dev phpstan/phpstan
./vendor/bin/phpunit --testdox tests
./vendor/bin/phpstan analyse src --level=9Начиная с PHPUnit 10 метаданные пишутся как атрибуты PHP: #[DataProvider] заменяет аннотацию @dataProvider в докблоке. Поставщик данных должен быть публичным и статическим, потому что PHPUnit читает его ещё до создания экземпляра тестового класса. Каждый набор данных несёт описательный ключ, который выводится как есть при падении случая - сбой accents находится мгновенно.
<?php
declare(strict_types=1);
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
final class SlugifierTest extends TestCase
{
#[DataProvider('provideTitles')]
public function testSlugify(
string $input,
string $expected
): void {
$this->assertSame($expected, slugify($input));
}
public static function provideTitles(): array
{
return [
'simple' => [
'Hello World', 'hello-world'
],
'accents' => [
'Déjà vu', 'deja-vu'
],
];
}
}PHPStan градуирует свою строгость по уровням, от 0 до 9 (в свежих версиях есть и уровень 10): на уровне 9 любое значение mixed становится непригодным к использованию, пока его не сузили явными проверками. Настоящая сила инструмента - в типах из докблоков, которые движок PHP игнорирует, а анализатор проверяет: формы массивов array{email: string}, списки list<int>, обобщения. Они одновременно документируют и доказывают.
<?php
declare(strict_types=1);
function findEmail(?array $user): string
{
return $user['email'];
}
/**
* @param array{email: string}|null $user
*/
function findEmailSafe(?array $user): string
{
return $user === null
? 'n/a'
: $user['email'];
}PSR (PHP Standards Recommendations) - это соглашения группы PHP-FIG. PSR-1 и PSR-12 стандартизируют стиль: отступы, фигурные скобки, порядок импортов - всё это автоматически применяют php-cs-fixer или phpcs. PSR-4 определяет автозагрузку: префикс пространства имён сопоставляется с каталогом, что позволяет Composer найти любой класс без ручного require. Наконец, PSR с интерфейсами - PSR-3 для логгеров, PSR-7 для HTTP-сообщений - позволяют заменить одну библиотеку другой, не трогая код, который её использует.