目次
デザイン パターン
シングル ケース モード
ファクトリ モード
登録モード
戦略パターン
观察者模式
原型模式
装饰器模式
ホームページ バックエンド開発 PHPの問題 PHPのデザインパターンとは何ですか

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

Jun 12, 2019 am 10:28 AM
php デザインパターン

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

デザイン パターン

シングルトン モードは、プロジェクト全体で一意のオブジェクト インスタンスを作成する方法の問題を解決し、ファクトリ モードは、プロジェクト全体で一意のオブジェクト インスタンスを作成する方法の問題を解決します。 new.メソッドを使用しないインスタンスオブジェクト。 (php ビデオ チュートリアル )

シングル ケース モード

  1. $_instance は静的プライベート変数として宣言する必要があります
  2. コンストラクターとデストラクター外部プログラムが新しいクラスを作成してシングルトン モードの意味を失わないようにするために、プライベートとして宣言する必要があります。
  3. getInstance() メソッドを public に設定する必要があり、このメソッドを呼び出して、インスタンス
  4. : :オペレーターは静的変数と静的関数にのみアクセスできます
  5. 新しいオブジェクトはメモリを消費します
  6. 使用シナリオ: 最も一般的に使用される場所はデータベース接続です。
  7. シングルトン モードを使用してオブジェクトを生成した後、そのオブジェクトは他の多くのオブジェクトで使用できます。
  8. Private __clone() メソッドはオブジェクトの複製を防止します

シングルトン モードでは、特定のクラスのオブジェクトを 1 つだけ作成できます。コンストラクターのプライベート変更。<br>静的な getInstance メソッドを宣言し、このメソッド内でオブジェクトのインスタンスを作成します。インスタンスがすでに存在する場合、インスタンスは作成されません。たとえば、データベース接続を作成するだけで済みます。

ファクトリ モード

ファクトリ モード、ファクトリ メソッドまたはクラスは、コード内で直接新しいオブジェクトを生成するのではなく、オブジェクトを生成します。 <br>ファクトリ パターンを使用すると、クラスの名前やメソッドを変更したり、このクラスを呼び出すすべてのコードでその名前やパラメータを変更したりすることを回避できます。

1

<br>

ログイン後にコピー

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

登録モード

登録モードは、グローバル共有および交換オブジェクトを解決します。作成されたオブジェクトはグローバルに使用可能な配列上に保持され、必要に応じて配列から直接取得できます。オブジェクトをグローバルツリーに登録します。どこへでも直接訪問してください。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<?php class Register

{

    protected static  $objects;

    function set($alias,$object)//将对象注册到全局的树上

    {

        self::$objects[$alias]=$object;//将对象放到树上

    }

    static function get($name){

        return self::$objects[$name];//获取某个注册到树上的对象

    }

    function _unset($alias)

    {

        unset(self::$objects[$alias]);//移除某个注册到树上的对象。

    }

}

ログイン後にコピー

さまざまなまったく異なる機能インターフェイスを統合 API にカプセル化します。 <br>PHP には MySQL、MySQLi、PDO の 3 つのデータベース操作があり、アダプター モードを使用して統合できるため、異なるデータベース操作を同じ API に統合できます。同様のシナリオには、memcache、redis、file、apc などのさまざまなキャッシュ機能を一貫したものに統合できるキャッシュ アダプターが含まれます。 <br>最初にインターフェイスを定義します (いくつかのメソッドと対応するパラメーターを使用)。次に、いくつかの異なる状況がある場合は、インターフェースを実装するためのいくつかのクラスを作成するだけです。同様の機能を実行する機能を一貫したメソッドに統合します。

1

2

3

4

5

6

7

8

接口 IDatabase

<?php namespace IMooc;

interface IDatabase

{

    function connect($host, $user, $passwd, $dbname);

    function query($sql);

    function close();

}

ログイン後にコピー

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

MySQL

<?php namespace IMooc\Database;

use IMooc\IDatabase;

class MySQL implements IDatabase

{

    protected $conn;

    function connect($host, $user, $passwd, $dbname)

    {

        $conn = mysql_connect($host, $user, $passwd);

        mysql_select_db($dbname, $conn);

        $this->conn = $conn;

    }

 

    function query($sql)

    {

        $res = mysql_query($sql$this->conn);

        return $res;

    }

 

    function close()

    {

        mysql_close($this->conn);

    }

}

ログイン後にコピー

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

MySQLi

<?php namespace IMooc\Database;

use IMooc\IDatabase;

class MySQLi implements IDatabase

{

    protected $conn;

 

    function connect($host, $user, $passwd, $dbname)

    {

        $conn = mysqli_connect($host, $user, $passwd, $dbname);

        $this->conn = $conn;

    }

 

    function query($sql)

    {

        return mysqli_query($this->conn, $sql);

    }

 

    function close()

    {

        mysqli_close($this->conn);

    }

}

ログイン後にコピー

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

PDO

<?php namespace IMooc\Database;

use IMooc\IDatabase;

class PDO implements IDatabase

{

    protected $conn;

    function connect($host, $user, $passwd, $dbname)

    {

        $conn = new \PDO("mysql:host=$host;dbname=$dbname", $user, $passwd);

        $this->conn = $conn;

    }

function query($sql)

    {

        return $this->conn->query($sql);

    }

 

    function close()

    {

        unset($this->conn);

    }

}

ログイン後にコピー

上記のケースを通じて、PHP 間のデータベース対話には 3 つの API セットが存在します。異なる API は異なるシナリオで使用される可能性があるため、開発されたコードが別の環境に変更された場合、そのデータベース API を変更する必要がある場合があり、その後、すべてのコードを書き直す必要があります。アダプター モードを使用した後、統合された API を使用できます。 API の違いにより、環境が変わった後にコードを書き直す必要が生じます。

戦略パターン

戦略パターンは、特定の特定のコンテキストに適応するために、特定の動作とアルゴリズムのセットをクラスにカプセル化します。 <br>例: 電子商取引 Web サイト システムがある場合、男性と女性のユーザーは異なる商品カテゴリにジャンプする必要があり、すべての広告スペースに異なる広告が表示されます。従来のコードでは、さまざまな if else 判断がハードコーディングされた方法でシステムに追加されます。ある日ユーザーが追加された場合、コードを書き直す必要があります。ポリシー モードを使用して、新しいユーザー タイプを追加する場合は、ポリシーを追加するだけで済みます。それ以外の場合は、別の戦略が必要になります。 <br>最初にストラテジのインターフェイス ファイルを宣言し、ストラテジに含まれる動作を規定します。次に、それぞれの特定の戦略実装クラスを定義します。

1

2

3

4

5

6

7

8

9

UserStrategy.php

<?php /*

 * 声明策略文件的接口,约定策略包含的行为。

 */

interface UserStrategy

{

    function showAd();

    function showCategory();

}

ログイン後にコピー

1

2

3

4

5

6

7

8

9

10

11

FemaleUser.php

<?php require_once &#39;Loader.php&#39;;

class FemaleUser implements UserStrategy

{

    function showAd(){

        echo "2016冬季女装";

    }

    function showCategory(){

        echo "女装";

    }

}

ログイン後にコピー

1

2

3

4

5

6

7

8

9

10

11

MaleUser.php

<?php require_once &#39;Loader.php&#39;;

class MaleUser implements UserStrategy

{

    function showAd(){

        echo "IPhone6s";

    }

    function showCategory(){

        echo "电子产品";

    }

}

ログイン後にコピー

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

Page.php//执行文件

<!--?php require_once 'Loader.php';

class Page

{

    protected $strategy;

    function index(){

        echo "AD";

        $this--->strategy->showAd();

        echo "<br>";

        echo "Category";

        $this->strategy->showCategory();

        echo "<br>";

    }

    function setStrategy(UserStrategy $strategy){

        $this->strategy=$strategy;

    }

}

 

$page new Page();

if(isset($_GET['male'])){

    $strategy new MaleUser();

}else {

    $strategy new FemaleUser();

}

$page->setStrategy($strategy);

$page->index();

ログイン後にコピー

执行结果图: 

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

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

 总结: <br>通过以上方式,可以发现,在不同用户登录时显示不同的内容,但是解决了在显示时的硬编码的问题。如果要增加一种策略,只需要增加一种策略实现类,然后在入口文件中执行判断,传入这个类即可。实现了解耦。 <br>实现依赖倒置和控制反转 (有待理解) <br>通过接口的方式,使得类和类之间不直接依赖。在使用该类的时候,才动态的传入该接口的一个实现类。如果要替换某个类,只需要提供一个实现了该接口的实现类,通过修改一行代码即可完成替换。

观察者模式

1:观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。 <br>2:场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。 <br>3:观察者模式实现了低耦合,非侵入式的通知与更新机制。 

<br>定义一个事件触发抽象类。

1

2

3

4

5

6

7

8

9

10

11

12

13

EventGenerator.php

<?php require_once &#39;Loader.php&#39;;

abstract class EventGenerator{

    private $observers = array();

    function addObserver(Observer $observer){

        $this->observers[]=$observer;

    }

    function notify(){

        foreach ($this->observers as $observer){

            $observer->update();

        }

    }

}

ログイン後にコピー

定义一个观察者接口

1

2

3

4

5

Observer.php

<?php require_once &#39;Loader.php&#39;;

interface Observer{

    function update();//这里就是在事件发生后要执行的逻辑

}

ログイン後にコピー

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<!--?php //一个实现了EventGenerator抽象类的类,用于具体定义某个发生的事件

require 'Loader.php';

class Event extends EventGenerator{

    function triger(){

        echo "Event<br>";

    }

}

class Observer1 implements Observer{

    function update(){

        echo "逻辑1<br>";

    }

}

class Observer2 implements Observer{

    function update(){

        echo "逻辑2<br>";

    }

}

$event = new Event();

$event--->addObserver(new Observer1());

$event->addObserver(new Observer2());

$event->triger();

$event->notify();

ログイン後にコピー

当某个事件发生后,需要执行的逻辑增多时,可以以松耦合的方式去增删逻辑。也就是代码中的红色部分,只需要定义一个实现了观察者接口的类,实现复杂的逻辑,然后在红色的部分加上一行代码即可。这样实现了低耦合。

原型模式

原型模式(对象克隆以避免创建对象时的消耗) <br>1:与工厂模式类似,都是用来创建对象。 <br>2:与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。 <br>3:原型模式适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需要内存拷贝即可。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

Canvas.php

<!--?php require_once 'Loader.php';

class Canvas{

private $data;

function init($width = 20, $height = 10)

    {

        $data = array();

        for($i = 0; $i < $height; $i++)

        {

            for($j = 0; $j < $width; $j++)

            {

                $data[$i][$j] = '*';

            }

        }

        $this--->data = $data;

    }

function rect($x1$y1$x2$y2)

    {

        foreach($this->data as $k1 => $line)

        {

            if ($x1 $k1 or $x2  $char)

            {

              if ($y1>$k2 or $y2data[$k1][$k2] = '#';

            }

        }

    }

 

    function draw(){

        foreach ($this->data as $line){

            foreach ($line as $char){

                echo $char;

            }

            echo "<br>;";

        }

    }

}

ログイン後にコピー

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Index.php

<!--?php require 'Loader.php';

$c = new Canvas();

$c--->init();

$canvas1 new Canvas();

// $canvas1->init();

$canvas1 clone $c;//通过克隆,可以省去init()方法,这个方法循环两百次

//去产生一个数组。当项目中需要产生很多的这样的对象时,就会new很多的对象,那样

//是非常消耗性能的。

$canvas1->rect(2, 2, 8, 8);

$canvas1->draw();

echo "-----------------------------------------<br>";

// $canvas2 = new Canvas();

// $canvas2->init();

$canvas2 clone $c;

$canvas2->rect(1, 4, 8, 8);

$canvas2->draw();

ログイン後にコピー

执行结果:

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

装饰器模式

1:装饰器模式,可以动态的添加修改类的功能 <br>2:一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重写实现类的方法 <br>3:使用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大额灵活性。

以上がPHPのデザインパターンとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP データベースの操作 CakePHP データベースの操作 Sep 10, 2024 pm 05:25 PM

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles