Skip to content

Coding Standards

Vi følger PSR-12 som baseline for PHP-kodestil, med teamspecifikke tilføjelser beskrevet her.


PHP-version

Alle nye projekter og packages kræver PHP 8.2+. Brug moderne PHP-features: readonly properties, named arguments, enums, first-class callables.


Kodestil (PSR-12 + PHP-CS-Fixer)

Kodeformatering håndteres automatisk af PHP-CS-Fixer. Ingen manuelle diskussioner om whitespace i PR-reviews.

Kør lokalt:

vendor/bin/php-cs-fixer fix src/

Standard .php-cs-fixer.dist.php:

<?php

$finder = PhpCsFixer\Finder::create()
    ->in(__DIR__ . '/src')
    ->in(__DIR__ . '/tests');

return (new PhpCsFixer\Config())
    ->setRules([
        '@PSR12' => true,
        '@PHP82Migration' => true,
        'declare_strict_types' => true,
        'ordered_imports' => ['sort_algorithm' => 'alpha'],
        'no_unused_imports' => true,
        'trailing_comma_in_multiline' => true,
        'array_syntax' => ['syntax' => 'short'],
    ])
    ->setFinder($finder);

Static Analysis (PHPStan)

Alle projekter kører PHPStan level 8 som minimum. Nye projekter starter på level 9.

vendor/bin/phpstan analyse src --level=8

Element Konvention Eksempel
Klasser PascalCase UserInvitationService
Interfaces PascalCase + Interface-suffix PaymentGatewayInterface
Traits PascalCase + Trait-suffix HasTimestampsTrait
Enums PascalCase InvoiceStatus
Metoder camelCase sendVerificationEmail()
Properties camelCase $billingAddress
Konstanter UPPER_SNAKE_CASE MAX_RETRY_ATTEMPTS
Filer PascalCase (én klasse per fil) UserInvitationService.php

Generelle principper

Strict types: Alle PHP-filer starter med declare(strict_types=1);

Type declarations: Alle metoder har fuld type-annotation — parametre, return types og property types. Brug mixed kun som sidste udvej.

Dependency Injection: Injicer afhængigheder via constructor. Undgå service locators og statiske metoder til afhængigheder.

Enkelt ansvar: En klasse har ét ansvar. Er din klasse svær at navngive præcist? Den gør sandsynligvis for meget.

Immutability: Foretruk readonly properties og value objects frem for mutable state.


Hvad vi ikke gør

  • Vi bruger ikke var_dump() eller dd() i commitseret kode
  • Vi committer ikke composer.lock-konflikter uløste
  • Vi sætter ikke @suppress på PHPStan-fejl uden en kommentar der forklarer hvorfor
  • Vi bruger ikke array som type-hint hvor vi kan bruge en specifik type