Entwurfsmuster in PHP mit Beispielen: von A bis Z

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Entwurfsmuster in PHP: von den Grundlagen bis zu fortgeschrittenen Techniken



Entwurfsmuster (Design Patterns) sind mehrfach erprobte Lösungen für typische Probleme, die bei der Entwicklung von Software auftreten. Für einen PHP-Entwickler ist die Kenntnis von Entwurfsmustern nicht nur ein Pluspunkt im Lebenslauf, sondern ein echtes Werkzeug zur Erstellung von flexiblem, wartbarem und skalierbarem Code. In diesem Artikel analysieren wir die drei Schlüsselgruppen der GoF-Muster (Gang of Four) mit konkreten Beispielen in PHP, die Sie sofort in Ihren Projekten anwenden können.



1. Erzeugungsmuster (Creational Patterns)

Diese Muster sind für die Objekterzeugung zuständig, indem sie die Instanziierungslogik verbergen und das System unabhängig von der Art und Weise der Erstellung und Zusammensetzung von Objekten machen.



Singleton (Einzelstück)

Stellt sicher, dass eine Klasse nur eine einzige Instanz hat, und bietet einen globalen Zugriffspunkt darauf. Ein klassisches Beispiel ist die Datenbankverbindung.



<?phpclass Database {    private static ?Database $instance = null;    private PDO $pdo;

private function __construct() { $this->pdo = new PDO('mysql:host=localhost;dbname=test', 'root', ''); }

public static function getInstance(): Database { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; }

public function query(string $sql): array { // Logik der Abfrageausführung return $this->pdo->query($sql)->fetchAll(); }

// Klonen und Deserialisierung verbieten private function __clone() {} public function __wakeup() { throw new Exception("Cannot unserialize singleton"); }}

// Verwendung$db = Database::getInstance();$results = $db->query("SELECT * FROM users");?>


Factory Method (Fabrikmethode)

Definiert eine Schnittstelle zur Erstellung eines Objekts, ermöglicht es Unterklassen jedoch, den Typ des erstellten Objekts zu ändern. Ideal geeignet für die Erstellung von Familien verwandter Objekte.



<?phpinterface Logger {    public function log(string $message): void;}

class FileLogger implements Logger { public function log(string $message): void { file_put_contents('app.log', $message . PHP_EOL, FILE_APPEND); }}

class DatabaseLogger implements Logger { public function log(string $message): void { // In DB speichern echo "Logged to DB: $message"; }}

abstract class LoggerFactory { abstract public function createLogger(): Logger;

public function logMessage(string $message): void { $logger = $this->createLogger(); $logger->log($message); }}

class FileLoggerFactory extends LoggerFactory { public function createLogger(): Logger { return new FileLogger(); }}

class DatabaseLoggerFactory extends LoggerFactory { public function createLogger(): Logger { return new DatabaseLogger(); }}

// Verwendung$factory = new FileLoggerFactory();$factory->logMessage("Diese Nachricht wird in die Datei geschrieben");?>


2. Strukturmuster (Structural Patterns)

Sie legen fest, wie Klassen und Objekte zu größeren Strukturen zusammengefasst werden können, während Flexibilität und Effizienz erhalten bleiben.



Adapter (Adapter)

Ermöglicht Objekten mit inkompatiblen Schnittstellen die Zusammenarbeit. Der Adapter fungiert als Wrapper, der Aufrufe einer Schnittstelle in eine andere umwandelt.



<?php// Alte Klasse mit unpraktischer Schnittstelleclass OldPaymentSystem {    public function processPayment(float $amount, string $currency): string {        return "Processing $amount $currency via legacy system";    }}

// Neue Schnittstelle, die wir verwenden möchteninterface NewPaymentInterface { public function pay(float $amount): string;}

// Adapterclass PaymentAdapter implements NewPayme

Blogs

Buchempfehlungen