PHP、特に PHP の属性、列挙型、読み取り専用プロパティなどの最新の機能を備えた PHP は、デザイン パターンの実装に適しています。ここでは、ソフトウェア エンジニアが知っておくべき 5 つの重要なパターンを紹介します。
クラスのインスタンスが 1 つだけであることを保証します。
final class Config { private static ?Config $instance = null; private function __construct(public readonly array $settings) {} public static function getInstance(): Config { return self::$instance ??= new Config(['env' => 'production']); } } // Usage $config = Config::getInstance(); echo $config->settings['env']; // Output: production
オブジェクト作成ロジックを一元化します。
class DatabaseFactory { public static function create(string $type): Database { return match ($type) { 'mysql' => new MySQLDatabase(), 'postgres' => new PostgresDatabase(), default => throw new InvalidArgumentException("Unknown database type"), }; } } interface Database { public function connect(): void; } class MySQLDatabase implements Database { public function connect() { echo "MySQL connected"; } } class PostgresDatabase implements Database { public function connect() { echo "Postgres connected"; } } // Usage $db = DatabaseFactory::create('mysql'); $db->connect(); // Output: MySQL connected
状態の変化について複数のオブジェクトに通知します。
class Event { private array $listeners = []; public function attach(callable $listener): void { $this->listeners[] = $listener; } public function trigger(string $data): void { foreach ($this->listeners as $listener) $listener($data); } } // Usage $event = new Event(); $event->attach(fn($data) => print "Listener 1: $data\n"); $event->attach(fn($data) => print "Listener 2: $data\n"); $event->trigger("Event triggered"); // Output: // Listener 1: Event triggered // Listener 2: Event triggered
オブジェクトに動作を動的に追加します。
interface Text { public function render(): string; } class PlainText implements Text { public function __construct(private string $text) {} public function render(): string { return $this->text; } } class BoldText implements Text { public function __construct(private Text $text) {} public function render(): string { return "<b>" . $this->text->render() . "</b>"; } } // Usage $text = new BoldText(new PlainText("Hello, World!")); echo $text->render(); // Output: <b>Hello, World!</b>
実行時にアルゴリズムを切り替えます。
interface PaymentStrategy { public function pay(float $amount): void; } class CreditCardPayment implements PaymentStrategy { public function pay(float $amount): void { echo "Paid $amount with Credit Card\n"; } } class PayPalPayment implements PaymentStrategy { public function pay(float $amount): void { echo "Paid $amount via PayPal\n"; } } class PaymentProcessor { public function __construct(private PaymentStrategy $strategy) {} public function execute(float $amount): void { $this->strategy->pay($amount); } } // Usage $processor = new PaymentProcessor(new PayPalPayment()); $processor->execute(100.00); // Output: Paid 100 via PayPal
これらのパターンは現実世界の問題を解決し、保守可能でスケーラブルなアプリケーションを作成するための基礎となります。
あなたの現在のプロジェクトと共鳴するパターンはどれですか?コメントで議論しましょう! ?
以上がすべてのソフトウェア エンジニアが知っておくべき主要な設計パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。