ホームページ  >  記事  >  バックエンド開発  >  PHPの3つの古典的なパターンを詳しく解説

PHPの3つの古典的なパターンを詳しく解説

藏色散人
藏色散人転載
2019-11-15 13:58:112644ブラウズ

シングルトン モード

シングルトン モードの意味:

シングルトン モードは、オブジェクト作成モードとして、特定のクラスのみが持つことを保証します。自身をインスタンス化し、このインスタンスをシステム全体にグローバルに提供するインスタンス。インスタンスのコピーは作成されませんが、シングルトン クラス内に格納されているインスタンスへの参照を返します。

シングルトン パターンの 3 つの要素:

1. クラスの唯一のインスタンスを保存する静的変数。

2. コンストラクターとクローン関数はプライベートであり、インスタンス化のために外部に配置される必要があるため、シングルトン モードの意味はありません。

3. 外部からアクセスできるパブリック静的メソッドを提供します。このメソッドはクラスの唯一のインスタンスを返します。

シングルトン モードの意味:

PHP のアプリケーションは主にデータベース アプリケーションであるため、アプリケーション内で多数のデータベース操作が発生します。オブジェクト指向 この方法で開発する場合、シングルトン モードを使用すると、新しい操作による大量のリソースの消費を回避できます。これは完全にシステム リソースを節約するためのものではありませんが、PHP はクラスをインスタンス化するたびに対応するリソースをクリーンアップし、再度使用されるときに再度インスタンス化するため、インスタンス化の繰り返しを避けることができます。

シングルトン モードを使用するシナリオ:

1. データベース操作により、データ パス上の新しい操作が減り、メモリ リソースとシステム リソースの消費が削減されます。

2. 設定リソースの共有: システムでは、設定リソースはグローバルです。シングルトン モードを使用すると、毎回の設定の読み取りによるメモリとシステム リソースの消費を削減することもできます。

コードのデモ:

<?php
class Single
{
    public static $attribute = &#39;&#39;;
    public static $instance = &#39;&#39;;
    private function __construct($attribute = &#39;个人技术&#39;)
    {
        self::$attribute = $attribute;
    }
    public static function getInstance($attribute = &#39;我是编程浪子走四方1&#39;)
    {
        if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
        return self::$instance;
    }
}

シングルトン モードと非シングルトン モードの違い:

class Single {
    public function index() {
        return &#39;&#39;;
    }
}
$single1 = new Single();
$single2 = new Single();
var_dump($single1);
var_dump($single2);
if ($single2 === $single1) {
    echo "是同一个对象";
} else {
    echo "不是同一个对象";
}
// object(Single)#1 (0) {
// }
// object(Single)#2 (0) {
// }
// 不是同一个对象
class Single2 {
    // 1.声明一个静态属性,用户保存类的实例
    public static $instance;
    //3. 将构函数私有化,避免外部new(每new一次,就不是同一个实例)
    private function __construct() {
    }
    // 2.声明一个静态的公共方法,用户外部调用本类的实例
    public static function getInstance() {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self;
        }
        return self::$instance;
    }
    //3. 克隆函数私有化,避免外部clone(每clone一次,就不是同一个实例)
    private function __clone() {
    }
}
$singleDemo1 = Single2::getInstance();
$singleDemo2 = Single2::getInstance();
var_dump($singleDemo1->getInstance());
var_dump($singleDemo2->getInstance());
if ($singleDemo1 === $singleDemo2) {
    echo "是同一个对象";
} else {
    echo "不是同一个对象";
}
// object(Single2)#3 (0) {
// }
// object(Single2)#3 (0) {
// }
// 是同一个对象

ファクトリー モード

ファクトリ パターンの意味:

他のオブジェクトのメソッドの生成を担当します。簡単に説明すると、ファクトリ クラスを通じて他のクラスまたはメソッドをインスタンス化します。

ファクトリ パターンの重要性:

ファクトリ パターンを使用すると、複数の変更が必要となる同じクラスの新しいインスタンスの数を減らすことができます。クラスが変わります。

コードのデモ:

<?php
class Factor
{
    public static function createDB()
    {
        echo &#39;我生产了一个DB实例&#39;;
        return new DB;
    }
}
class DB
{
    public function __construct()
    {
        echo __CLASS__ . PHP_EOL;
    }
}
$db = Factor::createDB();

登録ツリー モード

登録番号の意味:

登録ツリー 複数のオブジェクトをオブジェクトプールに登録し、必要なときにオブジェクトプールから直接取得できるようにすることです。

登録番号モードの利点:

シングルトン モードはプロジェクト全体で一意のオブジェクト インスタンスを作成する方法の問題を解決し、ファクトリ モードはその問題を解決します。インスタンス オブジェクトを作成するために新しいメソッドを渡さない方法について説明します。

それでは、登録ツリー モードはどのような問題を解決したいのでしょうか?この問題を検討する前に、最初の 2 つのモデルが現在直面している制限を考慮する必要があります。

まず、シングルトンモードでユニークなオブジェクトを作成するプロセス自体にも、オブジェクトが存在するかどうかという判断があります。存在する場合はオブジェクトが返され、存在しない場合はオブジェクトが作成されて返されます。

インスタンス オブジェクトを作成するたびに、このような判断層が必要になります。

ファクトリーモデルでは、延長メンテナンスの問題がより考慮されています。

一般に、シングルトン モードとファクトリ モードでは、より合理的なオブジェクトを生成できます。これらのオブジェクトを簡単に呼び出すにはどうすればよいでしょうか?

しかも、このようにしてプロジェクト内で作成されたオブジェクトは、散りばめられた兵隊のようなもので、全体の管理や整理に不便です。そこで、登録ツリー モデルが登場しました。

シングルトン モード、ファクトリ モード、またはその 2 つの組み合わせのいずれでオブジェクトを生成しても、それらはすべて登録ツリーに「挿入」されます。オブジェクトを使用するときは、登録ツリーから直接オブジェクトをフェッチするだけです。

これは、グローバル変数を使用するのと同じくらい便利で実用的です。また、登録ツリー パターンは、他のパターンにも非常に良いアイデアを提供します。

コードデモ:

<?php
/**
 * 单例模式
 */
class Single
{
    public static $attribute = &#39;&#39;;
    public static $instance = &#39;&#39;;
    private function __construct($attribute = &#39;个人技术&#39;)
    {
        self::$attribute = $attribute;
    }
    public static function getInstance($attribute = &#39;个人技术1&#39;)
    {
        if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
        return self::$instance;
    }
}
/**
 * 工厂模式
 */
class Factory
{
    public static function createObj()
    {
        return Single::getInstance(&#39;个人技术&#39;);
    }
}
/**
 * 注册模式
 * 含义:就是将对象放在一个对象池中,使用的时候直接去对象池查找.
 * 需要如下几个操作:
 * 1.注册
 * 2.存放对象池
 * 3.获取
 * 4.销毁
 */
Class Register
{
    // 用一个数组来当做对象池,键当做对象别名,值存储具体对象
    public static $objTree = [];
    // 将对象放在对象池
    public static function set($key, $val)
    {
        return self::$objTree[$key] = $val;
    }
    // 通过对象别名在对象池中获取到对象别名
    public static function get($key)
    {
        return self::$objTree[$key];
    }
    // 通过对象别名将对象从对象池中注销
    public static function _unset($key)
    {
        unset(self::$objTree[$key]);
    }
}
Register::set(&#39;single&#39;, Factory::createObj());
$single = Register::get(&#39;single&#39;);
print_r($single);
echo $single::$attribute;

以上がPHPの3つの古典的なパターンを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。