ホームページ  >  記事  >  バックエンド開発  >  PHP のシングルトン パターンについて話しましょう

PHP のシングルトン パターンについて話しましょう

青灯夜游
青灯夜游転載
2021-07-26 19:05:244104ブラウズ

前の記事「PHP のテンプレート メソッド パターンの詳細分析」では、PHP のテンプレート メソッド パターンについて紹介しました。次の記事では、PHP デザイン パターンのシングルトンについて説明します。 。 モデル。

PHP のシングルトン パターンについて話しましょう

#シングルトン パターンは、一般的に使用され、頻繁に質問されるインタビュー デザイン パターンの中で間違いなく 1 位にランクされます。一方で、それは非常にシンプルであり、いくつかの言葉で説明できます。一方で、非常に複雑であり、その実装は 1 つの形式だけでなく、Java などの非同期言語におけるマルチスレッド ロックの問題も考慮する必要があります。したがって、面接中、面接官がシングルトン モデルについて質問するときにリラックスするとは思わないでください。このモデルは実際には深いことも浅いこともあり、開発者のレベルを非常に反映する可能性があります。一定期間仕事をしていると必ずこのモデルに触れる事になるからです。

Gof クラスの図と説明

GoF 定義: クラスにはインスタンスが 1 つだけあることを確認し、それにアクセスするためのグローバル アクセス ポイントを提供します。

#GoF クラス図

PHP のシングルトン パターンについて話しましょう

##コード実装

class Singleton
{
    private static $uniqueInstance;
    private $singletonData = '单例类内部数据';

    private function __construct()
    {
        // 构造方法私有化,外部不能直接实例化这个类
    }

    public static function GetInstance()
    {
        if (self::$uniqueInstance == null) {
            self::$uniqueInstance = new Singleton();
        }
        return self::$uniqueInstance;
    }

    public function SingletonOperation(){
        $this->singletonData = '修改单例类内部数据';
    }

    public function GetSigletonData()
    {
        return $this->singletonData;
    }

}
はい、コアはそのようなシングルトン クラスであり、他には何もありません。インスタンス化後に静的変数自体を保存します。このオブジェクトが必要な場合は、GetInstance() メソッドを呼び出して、グローバルに一意のオブジェクトを取得します。

$singletonA = Singleton::GetInstance();
echo $singletonA->GetSigletonData(), PHP_EOL;

$singletonB = Singleton::GetInstance();

if ($singletonA === $singletonB) {
    echo '相同的对象', PHP_EOL;
}
$singletonA->SingletonOperation(); // 这里修改的是A
echo $singletonB->GetSigletonData(), PHP_EOL;

クライアントによって呼び出されると、

singletonB がまったく同じオブジェクトであることがわかります。

PHP のシングルトン パターンについて話しましょう

はい、コードからわかるように、シングルトンの最大の用途は、オブジェクトをグローバルに一意にすることです。
  • それでは、グローバルな独自性のメリットとは何でしょうか?一部のクラスの作成は非常に高価であり、毎回新しいオブジェクトを使用する必要はありません。それらは 1 つのオブジェクトとして再利用できます。変更する必要がある属性や状態はありませんが、一部のパブリック サービスを提供するだけです。たとえば、データベース操作クラス、ネットワーク リクエスト クラス、ログ操作クラス、構成管理サービスなどです。
  • あるインタビュアーが、「PHP にはシングルトンしかないのですか?」と尋ねたことがあります。 1 つのプロセスの下、つまり 1 fpm の下にある場合は、もちろん一意です。 nginx が同時にプルアップする複数の fpm のうち、これが唯一のものではありません。 1工程に1工程!
  • シングルトン パターンの利点: 一意のインスタンスへのアクセスの制御、名前空間の縮小、操作とプレゼンテーションの改良が可能、インスタンスの可変数が可能、クラス操作よりも柔軟です。
  • Laravel は IoC コンテナ部分でシングルトンモードを使用します。コンテナ部分の内容については、今後のLaravelの連載で解説していきます。シングルトン メソッドは Illuminate\Container\Container クラスにあります。バインド メソッドで getClosure メソッドを呼び出します。追跡を続けると、最終的にはコンテナの make メソッドまたは build メソッドを呼び出してクラスをインスタンス化することがわかります。make メソッドまたは build メソッドに関係なく、シングルトンの判断、つまりクラスがインスタンス化されているかどうかを判断します。インスタンス化されているか、コンテナ内にすでに存在しています。ビルド中の (!$reflector->isInstantiable()) の場合。
会社はますます大きくなっていますが、すべての会社名簿のコピー (単一インスタンス クラス) が 1 つしかなく、OA システムに保存されています。怖いのは、部署ごとに名簿を作成することで更新が間に合わず、他部署からの新入社員や退職者が漏れてしまうなど混乱が生じることです。他の部門は、必要に応じて名簿全体を表示したり、名簿全体に基づいて自分の部門のセクションを作成および変更したりできます。しかし、OA システムでは、実際に変更されるのは一般的な名簿の内容です。全員が管理しているのは、実際には OA システム サーバーに保存されている唯一の実際の名簿です。

完全なコード: https: //github.com/zhangyue0503/designpatterns-php/blob/master/21.singleton/source/singleton.php

Example

以来上で、データベース操作クラスとネットワーク リクエスト クラスの両方がシングルトン モードを使用することを好むと述べました。次に、HTTP リクエスト クラスのシングルトン モードの開発を実装します。私が Android を開発していた昔は、フレームワークが今ほど多くなく、HTTP リクエストはすべてそれ自体でカプセル化されており、オンライン チュートリアルの多くはシングルトン モードを採用していたと記憶しています。

キャッシュ クラス図

PHP のシングルトン パターンについて話しましょう
##完全なソース コード: https://github.com/ zhangyue0503/designpatterns-php/blob/master/21.singleton/source/singleton-http.php
<?php 

class HttpService{
    private static $instance;

    public function GetInstance(){
        if(self::$instance == NULL){
            self::$instance = new HttpService();
        }
        return self::$instance;
    }

    public function Post(){
        echo &#39;发送Post请求&#39;, PHP_EOL;
    }

    public function Get(){
        echo &#39;发送Get请求&#39;, PHP_EOL;
    }
}

$httpA = new HttpService();
$httpA->Post();
$httpA->Get();

$httpB = new HttpService();
$httpB->Post();
$httpB->Get();

var_dump($httpA == $httpB);

説明

  • まだ非常に単純ですか?ここでは、この形式のシングルトンについてはこれ以上説明しません。他のいくつかの形式のシングルトンについて話しましょう
  • Java などの静的言語の場合宣言 PHP のシングルトン パターンについて話しましょう

    #instance = new HttpService(); では、静的変数を直接新しいオブジェクトにすることができます。このように、GetInstance() メソッドは省略できますが、この静的変数は使用されるかどうかに関係なく直接インスタンス化され、メモリを占有します。この種のシングルトンは、Hungry Chinese シングルトン パターンと呼ばれます。

  • 私たちのコードと例は明らかにハングリーマンスタイルではなく、この形式は怠け者スタイルと呼ばれます。 GetInstance() を積極的に使用して取得する必要があります。その後、オブジェクトを作成します。
  • Lazy スタイル Java マルチスレッドや PHP で swoole を使用した後などのマルチスレッド アプリケーションでは、繰り返し作成される問題が発生し、複数回作成されたオブジェクトは同じオブジェクトではありません。現時点では、グローバル オブジェクトが 1 つだけ存在することを確認するために、通常は二重検出が使用されます。特定のコードは自分で見つけることができます。 Hungry Han スタイル自体はすでに static 属性に値が割り当てられているため、再度変更されることはありません。
  • もう 1 つの方法は、静的内部クラスを作成することです。これはめったに見られず、リソース使用率が高くなります。静的変数をメソッド内に配置すると、静的変数はクラス内の変数ではなくメソッド内の変数になります。これにより、シングルトン オブジェクトが独自の静的メソッドとプロパティを呼び出すことができます。
元のアドレス: https://juejin.cn/post/6844903990585458702

著者: ハードコア プロジェクト マネージャー

推奨学習: "

PHP ビデオ チュートリアル "

以上がPHP のシングルトン パターンについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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