Equipa tu código como un profesional con pruebas PHPUnit, análisis estático PHPStan de nivel 9 y los estándares PSR.
Abrir esta lección en KodokonEl código de nivel experto se reconoce menos por sus trucos ingeniosos que por su red de seguridad. Tres pilares complementarios: las pruebas (PHPUnit) que verifican el comportamiento ejecutando el código, el análisis estático (PHPStan) que demuestra propiedades sin ejecutar nada, y los estándares compartidos (PSR) que hacen que el ecosistema sea interoperable. Todo se instala con Composer, como dependencias de desarrollo.
composer require --dev phpunit/phpunit
composer require --dev phpstan/phpstan
./vendor/bin/phpunit --testdox tests
./vendor/bin/phpstan analyse src --level=9Desde PHPUnit 10, los metadatos se escriben como atributos PHP: #[DataProvider] reemplaza la anotación de docblock @dataProvider. Un data provider debe ser público y estático, porque PHPUnit lo lee incluso antes de instanciar la clase de prueba. Cada conjunto de datos lleva una clave descriptiva, mostrada tal cual cuando el caso falla - un fallo accents se localiza al instante.
<?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 gradúa su rigor por niveles, de 0 a 9 (existe un nivel 10 en las versiones recientes): en el nivel 9, cualquier valor mixed se vuelve inutilizable sin antes acotarlo mediante comprobaciones explícitas. Su verdadero poder proviene de los tipos de docblock que el motor de PHP ignora pero que el analizador verifica: formas de array array{email: string}, listas list<int>, genéricos. Documentan y demuestran al mismo tiempo.
<?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'];
}Los PSR (PHP Standards Recommendations) son las convenciones de PHP-FIG. PSR-1 y PSR-12 estandarizan el estilo: indentación, llaves, orden de las importaciones - aplicados automáticamente por php-cs-fixer o phpcs. PSR-4 define la carga automática: un prefijo de espacio de nombres se asocia a un directorio, lo que permite a Composer localizar cualquier clase sin un require manual. Por último, los PSR de interfaz - PSR-3 para los loggers, PSR-7 para los mensajes HTTP - te permiten cambiar una biblioteca por otra sin tocar el código que la consume.