Einleitung: Warum sauberer Code in PHP kein Luxus, sondern eine Notwendigkeit ist
Jeder PHP-Entwickler war schon mindestens einmal in der Situation, dass sich ein einfacher Bug in der Produktion in eine stundenlange Jagd nach dem „Teufel im Detail" verwandelte. Meistens liegt die Ursache nicht in der Komplexität der Logik, sondern im schmutzigen Code: sinnlose Variablennamen, Funktionen mit 500 Zeilen Länge, fehlende Typen und irreführende Kommentare. Clean Code ist nicht nur Ästhetik. Es ist ein Werkzeug, das die Wartungskosten eines Projekts um das 3- bis 5-fache senkt und es neuen Teammitgliedern ermöglicht, sich innerhalb von Stunden statt Wochen in das Projekt einzuarbeiten.
In diesem Artikel werden wir die wichtigsten Clean-Code-Prinzipien in Bezug auf PHP behandeln und sie mit realen Beispielen vor und nach dem Refactoring untermauern. Sie erfahren, wie Sie die PSR-Standards, die SOLID-Prinzipien und einfache Namensregeln anwenden, damit Ihr Code für sich selbst spricht.
1. Benennung von Variablen, Funktionen und Klassen: Sprechen Sie die Sprache des Geschäfts
Ein schlechter Name ist der größte Feind der Lesbarkeit. Wenn eine Variable $a oder $data heißt, verschwenden Sie beim Lesen des Codes jedes Mal mentale Ressourcen für die Entschlüsselung. Die Regel ist einfach: Der Name sollte die Frage „Was ist das?" oder „Was macht es?" beantworten.
Schlechtes Beispiel
<?php// Was ist $d? Warum $x = 2?$d = new DateTime();$x = 2;$y = $d->modify('+' . $x . ' days');echo $y->format('Y-m-d');?>Gutes Beispiel (Clean Code)
<?php$currentDate = new DateTime();$daysToAdd = 2;$futureDate = $currentDate->modify('+' . $daysToAdd . ' days');echo $futureDate->format('Y-m-d');?>Zusätzliche Regeln:
- Klassen und Interfaces — Substantive:
UserRepository,PaymentGatewayInterface. - Methoden — Verben:
getUserById(),sendEmailNotification(). - Boolesche Variablen — Präfixe
is,has,can:$isActive,$hasPermission. - Vermeiden Sie Abkürzungen:
$cnt→$count,$usr→$user.
2. Funktionen und Methoden: Das Prinzip der einzigen Verantwortung (SRP) in Aktion
Eine Funktion – eine Aktion. Wenn Sie eine Funktion sehen, die länger als 20–30 Zeilen ist, kann sie wahrscheinlich aufgeteilt werden. In PHP ist dies besonders relevant, da das Fehlen einer strengen Typisierung (vor PHP 7.4) zu „Code-Müllhalden" führt.
Schlechtes Beispiel: Die Schweizer Taschenmesser-Funktion
<?phpfunction processOrder(array $orderData): array{ // Validierung if (empty($orderData['email'])) { throw new InvalidArgumentException('Email required'); } // Speichern in der DB $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', ''); $stmt = $pdo->prepare('INSERT INTO orders (email, total) VALUES (?, ?)'); $stmt->execute([$orderData['email'], $orderData['total']]); // E-Mail senden mail($orderData['email'], 'Order Confirmed', 'Thank you!'); // Logging file_put_contents('log.txt', 'Order processed: ' . $orderData['email'] . PHP_EOL, FILE_APPEND); return ['status' => 'success'];}?>Gutes Beispiel: Trennung der Verantwortlichkeiten
<?phpclass OrderProcessor{ private OrderValidator $validator; private OrderRepository $repository; private MailService $mailer; private Logger $logger;
public function __construct( OrderValidator $validator, OrderRepository $repository, MailService $mailer, Logger $logger ) { $this->validator = $validator; $this->repository = $repository; $this->mailer = $mailer; $this->logger = $logger; }
public function process(array $orderData): arr