PHPのデザインパターンの紹介

公開: 2020-04-14

PHPデザインパターンは、開発者にとって非常に有用であることが証明されており、主要な問題解決者です。 効率的なコードを作成するには、開発者はベストプラクティスに従う必要があります。 PHPデザインパターンはオブジェクト指向プログラミング(OOP)の概念であり、現在Drupal8プロジェクトでも使用されています。 Drupal 8は最新のPHPおよびOOPの概念を採用しているため、デザインパターンを活用して、よりクリーンで堅牢なプログラミングを行うことができます。

PHPのデザインパターン

PHPのデザインパターンとは何ですか?

ソフトウェアエンジニアリングでは、デザインパターンは、ソフトウェアデザインで一般的に発生する問題に対する一般的な再現可能なソリューションです。 優れたオブジェクト指向デザインは、再利用可能、保守可能、拡張可能である必要があり、PHPのデザインパターンはそれを行うのに非常に役立つ可能性があります。 これは、問題の解決に役立つだけでなく、一般的な課題に対処するための最適な方法を意味します。

PHPデザインパターンを使用する利点

PHPのデザインパターンの主な利点は次のとおりです。

  • PHPデザインパターンは、開発中に直面する繰り返しの問題を解決するのに役立ちます
  • PHPでデザインパターンを使用すると、デザイナー間のコミュニケーションがより効率的になります。
  • コードはデザインパターンで適切に構造化されているため、コードを見ている他の開発者は理解するのに苦労する必要はありません。
  • ベストプラクティスに従うことで、より堅牢なソフトウェアを構築できます
  • 開発をより速く、より簡単にするのに役立ちます

PHPで広く使用されているデザインパターン

デザインパターンは、同様の問題を解決するためにさまざまな状況で使用できます。 約23のデザインパターンがあり、創造的、構造的、行動的パターンの3種類のデザインパターンに大まかに分類できます。

作成パターン:オブジェクト作成メカニズムで使用されるデザインパターン。オブジェクトを実装したシステムから切り離すことができるオブジェクトを作成します。

構造パターン:これにより、エンティティ間の関係を実現する簡単な方法を特定することで、設計が容易になります。

行動パターン:オブジェクト間の関係、責任、およびアルゴリズムを管理するために使用されます

ファクトリパターン

ファクトリパターンは、オブジェクトを構築するために使用されます。 そうです—オブジェクトを作成するのではなく、オブジェクトを作成します。 オブジェクトを作成するときは、最初にオブジェクトを作成してから初期化します。 通常、特定のロジックを適用し、複数の手順を実行する必要があります。 それで、それらすべてを1つの場所に置き、同じ方法で新しいオブジェクトを作成する必要があるときはいつでもそれを再利用することは理にかなっています。 基本的に、それはファクトリパターンの使用です。
ファクトリのインターフェイスを用意し、コードを具体的なファクトリではなく、それに依存させることをお勧めします。

 インターフェース FamilyFactoryInterface {
    公衆 関数 create ():ファミリー
}

次に、次のクラスでファクトリインターフェイスを実装します。

クラス FamilyFactory 実装 FamilyFactoryInterface {

公衆 関数 create ():ファミリー{

$ family = new Family();

//家族を初期化します

$ familyを返します。

}

}

アダプターパターン

アダプタデザインパターンでは、クラスが1つのクラスのインターフェイスを別のクラスに変換します。この例では、getTitle()メソッドとgetAuthor()メソッドを持つTextBookクラスがあります。 クライアントはgetTitleAndAuthor()メソッドを期待しています。 SimpleBookdemoAdapterに「適応」させるために、 TextBookのインスタンスを取り込んでTextBookのgetTitle()メソッドとgetAuthor()メソッドを独自のgetTitleAndAuthorメソッドで使用するアダプタークラスBookAdapterがあります。

<?php

クラス 教科書{

プライベート$ title;
プライベート$ author;
関数 __construct ($ title_in、$ author_in){
$ this-> title = $ title_in;

$ this-> author = $ author_in;
}

関数 getTitle (){
戻る $ this- > title;
}
関数 getAuthor (){
戻る $ this- > author;
}
}

クラス BookAdapter {
プライベート$ book;
関数 __construct (TextBook $ book_in){
$ this-> book = $ book_in;
}
関数 getTitleAndAuthors (){
戻る $ this-> book-> getTitle()。 'by' $ this-> book-> getAuthor();
}
}

// クライアント

writeln( 'アダプタパターンのテストを開始します' );
writeln( '' );

$ book = new TextBook( "Gamma、Helm、Johnson、and Vlissides" "Design Patterns" );
$ bookAdapter = new BookAdapter($ book);
writeln( '作成者とタイトル:' 。$ bookAdapter-> getTitleAndAuthor());
writeln( '' );

writeln( 'テストアダプターパターンの終了' );

関数 writeln ($ line_in){
$ line_inをエコーします。 "<br/>" ;
}

?>

PHPシングルトンパターン

クラスのインスタンス化を単一のオブジェクトに制限するために、PHPのシングルトンパターンが使用されます。 これは、システム全体で1つのオブジェクトのみが必要な場合に役立ちます。 Webアプリケーションの設計中に、特定のクラスの1つのインスタンスにのみアクセスを許可することは理にかなっています。 シングルトンパターンクラスからのオブジェクトの明示的な作成を防ぐために、プライベートコンストラクタが利用されます。

<?php
クラス シングルトン
{{
公衆 静的 関数 getInstance ()
{{
static $ instance = null ;
if null === $ instance){
$ instance = new 静的();
}
$ instanceを返します。
}
保護 関数 __construct ()
{{
}
民間 関数 __clone ()
{{
}
民間 関数 __wakeup ()
{{
}
}
クラス シングルトンチャイルド 拡張します シングルトン
{{
}
$ obj = Singleton :: getInstance();
var_dump($ obj === Singleton :: getInstance());
$ obj2 = SingletonChild :: getInstance();
var_dump($ obj2 === Singleton :: getInstance());
var_dump($ obj2 === SingletonChild :: getInstance());
?>

PHPのオブザーバーパターン

PHP Observerパターンは、特定の場所での特定のイベントについてシステムの残りの部分に警告するために使用されます。
たとえば、批評家に映画を上映するための劇場を作成する必要がある場合です。 現在のメソッドでクラスTheaterを定義します。 映画を上映する前に、批評家の携帯電話にメッセージを送りたいと思います。 次に、映画の途中で、批評家に間隔を空けるために5分間映画を停止します。 最後に、映画の終了後、批評家に彼らの反応を残すように頼みたいと思います。 したがって、PHPのオブザーバーパターンでは、オブザーバーオブジェクトはステータスが変更されたときにのみ通知されます。

これはコードがどのように見えるかです-

クラス 劇場{

公衆 関数 current (Movie $ movie): void {

$ critics = $ movie-> getCritics();
$ this-> message-> send($ critics、 '...' );

$ movie-> play();

$ movie-> pause( 5 );
$ this- > progress-> interval($ critics)
$ movie-> end();

$ this- > response-> request($ critics);
}
}

PHPのデコレータパターン

デコレータパターンは、実行時にオブジェクトの文字を変更する場合に使用されます。これにより、不要な継承とクラスの数を減らすことができます。 さて、それは例で説明することができます。 SofaクラスとBedクラスがあり、どちらもSleeperInterfaceを実装しているとします。

インターフェース SleeprInterface {
公衆 関数 sleep ():void;
}
クラス ソファー 実装 SleeperInterface {
公衆 関数 sleep ():void {
//ソファで寝る
}
}
クラス ベッド 実装 SleeperInterface {
公衆 関数 sleep ():void {
//ベッドで寝る
}
}

ソファとベッドはどちらも同じように眠ります。 今、私たちは、ユーザーがソファやベッドで寝ているときに睡眠追跡をユーザーに知らせる追加機能を備えた他のソファやベッドが必要です。 継承を使用すると、次のようにこの問題を解決できます。

クラス SmartSofa 拡張します ソファ{
パブリック関数sleep():void {
親:: sleep();
これを$ - > sleepHours();
}
}
クラス SmartBed 拡張します ウィンドウ{
パブリック関数sleep():void {
親:: sleep();
これを$ - > sleepHours();
}
}

現在、合計4つのクラスがあります。 ただし、この問題は、デコレータパターンのみを使用した3つのクラスで解決できました。 方法は次のとおりです。

クラス SmartSleeper 実装 SleeperInterface {

プライベート$ sleeper;
公衆 関数 __construct (SleeperInterface $ sleeper){
$ this-> sleeper = $ sleeper;
}

公衆 関数 sleep (): void {
$ this-> sleeper-> sleep();
$ this-> sleepHours();
}
}
$ソファ=新しいソファ();
$ bed = new Bed();
$ smartSofa = new SmartSleeper($ソファ);
$ smartBed = new SmartSleeper($ bed);

ここでは、プロキシのように機能するが、その上に追加機能を備えた新しいタイプのスリーパーを紹介しました。

Drupal8でのデザインパターンの活用

Drupal 8より前にDrupal内ですでに確立されている多くのデザインパターンがありますが、Drupal 8は現在、以前は利用できなかった多くのパターンで構成されています。 これらの新しいパターンのいくつかは、いくつかの古いパターンを完全に置き換えますが、他のパターンはDrupal8にいくつかの新しい機能を導入します。

Drupal8で使用されるデザインパターンは次のとおりです。

  • オブジェクト指向プログラミングパターン(OOP)
  • 依存性注入
  • ファクトリパターン
  • シングルトンパターン

OOPは実際には単一のパターンではありませんが、単なるデザインパターンを超えた、コードの概念化と構造化の完全に根本的な方法です。 これは、Drupal 8で使用されているものを含め、現在使用されている多くの一般的なソフトウェアデザインパターンの基礎です。Drupal7で導入されましたが、広く使用されておらず、必須ではありませんでした。 Drupal 8の状況は現在異なり、広く使用されており、必須です。

依存性注入

依存性注入は、ハードコードされた依存関係を削除し、実行時またはコンパイル時にそれらを変更できるようにするソフトウェアデザインパターンです。 依存性注入の追加は簡単で、既存のコードに干渉することはありません。 Drupal 8は、再利用可能な機能を分離するためにサービスの概念を導入しました。 core.services.ymlは、Drupal 8での依存性注入の例です。PHPのファクトリパターンとシングルトンパターンについては、上記ですでに説明しました。