Outillez votre code comme un professionnel avec les tests PHPUnit, l'analyse statique PHPStan au niveau 9 et les standards PSR.
Ouvrir cette leçon dans KodokonUn code de niveau expert se reconnaît moins à ses astuces qu'à son filet de sécurité. Trois piliers complémentaires : des tests (PHPUnit) qui vérifient le comportement en exécutant le code, une analyse statique (PHPStan) qui prouve des propriétés sans rien exécuter, et des standards partagés (PSR) qui rendent l'écosystème interopérable. Tout s'installe avec Composer, en dépendances de développement.
composer require --dev phpunit/phpunit
composer require --dev phpstan/phpstan
./vendor/bin/phpunit --testdox tests
./vendor/bin/phpstan analyse src --level=9Depuis PHPUnit 10, les métadonnées s'écrivent en attributs PHP : #[DataProvider] remplace l'annotation @dataProvider des docblocks. Un fournisseur de données doit être public et statique, car PHPUnit le lit avant même d'instancier la classe de test. Chaque jeu de données porte une clé descriptive, affichée telle quelle quand le cas échoue - un échec accents se localise instantanément.
<?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 gradue son exigence par niveaux, de 0 à 9 (un niveau 10 existe dans les versions récentes) : au niveau 9, toute valeur mixed devient inutilisable sans affinage préalable par des vérifications explicites. Sa vraie puissance vient des types en docblocks que le moteur PHP ignore mais que l'analyseur vérifie : formes de tableaux array{email: string}, listes list<int>, génériques. Ils documentent et prouvent à la fois.
<?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'];
}Les PSR (PHP Standards Recommendations) sont les conventions du PHP-FIG. PSR-1 et PSR-12 normalisent le style : indentation, accolades, ordre des imports - appliqués automatiquement par php-cs-fixer ou phpcs. PSR-4 définit l'autoloading : un préfixe de namespace correspond à un répertoire, ce qui permet à Composer de localiser toute classe sans require manuel. Enfin, les PSR d'interfaces - PSR-3 pour les loggers, PSR-7 pour les messages HTTP - permettent de remplacer une bibliothèque par une autre sans toucher au code qui la consomme.