Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung der PHP-Entwurfsmuster in der Praxis

Ausführliche Erläuterung der PHP-Entwurfsmuster in der Praxis

PHPz
PHPzOriginal
2024-05-07 13:57:01475Durchsuche

Entwurfsmuster bieten bewährte Lösungen für den Softwareentwurf und lösen häufig auftretende Programmierprobleme. Dieser Artikel wirft einen detaillierten Blick auf gängige Entwurfsmuster in PHP und erklärt sie anhand praktischer Fälle, wobei er Singleton-Muster, Factory-Methodenmuster und Beobachtermuster abdeckt.

PHP 设计模式实战详解

Detaillierte praktische Erklärung von PHP-Entwurfsmustern

Entwurfsmuster bieten eine Reihe bewährter Lösungen für das Software-Design zur Lösung häufiger Programmierprobleme. Dieser Artikel befasst sich mit den häufig verwendeten Entwurfsmustern in PHP und veranschaulicht sie anhand praktischer Fälle.

Singleton-Muster

Das Singleton-Muster stellt sicher, dass eine Klasse nur einmal instanziiert wird. Dies ist nützlich für globale Ressourcen oder Konfigurationsmanager.

class Database {
  private static ?\PDO $instance = null;

  private function __construct() {}

  public static function getInstance(): \PDO {
    if (self::$instance === null) {
      self::$instance = new \PDO('mysql:host=localhost;dbname=my_db', 'user', 'password');
    }

    return self::$instance;
  }
}

// 使用 Singleton
$db1 = Database::getInstance();
$db2 = Database::getInstance();

// 两个变量指向同一个 PDO 对象
var_dump($db1 === $db2); // true

Factory Method Pattern

Das Factory Method Pattern definiert eine Schnittstelle, die Objekte erstellt, aber Unterklassen ermöglicht, den Erstellungsprozess zu ändern. Dies bietet eine flexible Möglichkeit, Erstellungslogik und Produktklassen zu trennen.

interface Shape {
  public function draw(): void;
}

class Circle implements Shape {
  public function draw(): void {
    echo 'Drawing a circle.' . PHP_EOL;
  }
}

class Square implements Shape {
  public function draw(): void {
    echo 'Drawing a square.' . PHP_EOL;
  }
}

class ShapeFactory {
  public static function createShape(string $type): Shape {
    switch ($type) {
      case 'circle':
        return new Circle();
      case 'square':
        return new Square();
      default:
        throw new InvalidArgumentException('Invalid shape type.');
    }
  }
}

// 使用工厂方法
$circle = ShapeFactory::createShape('circle');
$square = ShapeFactory::createShape('square');

$circle->draw(); // Drawing a circle.
$square->draw(); // Drawing a square.

Beobachtermuster

Das Beobachtermuster definiert eine Eins-zu-viele-Abhängigkeitsbeziehung, in der ein Objekt (Subjekt) mehrere Objekte (Beobachter) über Zustandsänderungen benachrichtigen kann.

interface Subject {
  public function attach(Observer $observer): void;
  public function detach(Observer $observer): void;
  public function notify(): void;
}

class NewsPortal implements Subject {
  private array $observers = [];
  private string $latestNews;

  public function attach(Observer $observer): void {
    $this->observers[] = $observer;
  }

  public function detach(Observer $observer): void {
    unset($this->observers[array_search($observer, $this->observers)]);
  }

  public function notify(): void {
    foreach ($this->observers as $observer) {
      $observer->update($this);
    }
  }

  public function publishNews(string $news): void {
    $this->latestNews = $news;
    $this->notify();
  }
}

interface Observer {
  public function update(Subject $subject): void;
}

class NewsReader implements Observer {
  public function update(Subject $subject): void {
    $news = $subject->getLatestNews();
    echo 'Received latest news: ' . $news . PHP_EOL;
  }
}

// 使用观察者模式
$newsPortal = new NewsPortal();
$reader1 = new NewsReader();
$reader2 = new NewsReader();

$newsPortal->attach($reader1);
$newsPortal->attach($reader2);

$newsPortal->publishNews('New developments in the ongoing war.');
$newsPortal->detach($reader2);
$newsPortal->publishNews('Another major breakthrough in science.');

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der PHP-Entwurfsmuster in der Praxis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn