ホームページ  >  記事  >  バックエンド開発  >  【デザインパターン】PHPシングルトンパターンの応用シナリオと実装

【デザインパターン】PHPシングルトンパターンの応用シナリオと実装

大鹏
大鹏オリジナル
2020-06-02 00:58:483408ブラウズ

概要

シングルトン パターンとは何ですか?

クラスが 1 つのオブジェクト (またはインスタンス) のみを作成できる場合、このクラスはシングルトン クラスです。この設計パターンは、シングルトン デザイン パターン、または略してシングルトン パターンと呼ばれます。

シングルトンを使用する理由

  1. # リソース アクセスの競合を処理します。

    例: ログをファイルに出力する機能。

  2. # は、グローバルに一意なクラスを表します。


ビジネス概念から、一部のデータをシステム内の 1 つのコピーにのみ保存する必要がある場合は、それをシングルトン クラスとして設計する方が適しています。例: 固有の増加する ID 番号ジェネレーター。


#実装方法

PHP のシングルトンモードを実装するには 3 つの手順が必要です

* クラスを保存するために使用される静的メンバー変数。

* オブジェクトの作成または複製を防止するには、__construct と __clone をプライベートとして宣言する必要があります。

* このインスタンスにアクセスするためのパブリック静的メソッド。通常は getInstance

class single
{
    private static  $instance ;
    private function __construct(){}
    private function __clone(){}
    public static function getInstance() {
        if (empty(self::$instance)) {
            self::$instance = new single();
        }
        return self::$instance;
    }
}

ID を取得するメソッドをシングルトン クラスに追加します。グローバルに一意の ID 番号ジェネレーターが表示されます。

class single
{
    private  $id = 0;
    private static  $instance ;
    private function __construct(){}
    private function __clone(){}
    public static function getInstance() {
        if (empty(self::$instance)) {
            self::$instance = new single();
        }
        return self::$instance;
    }
    public function getId() {
        
        return $this->id++;
        
    }
}

これは本当に完璧ですが、マルチスレッドの場合はどうなるのでしょうか?

スレッドの唯一の単一インスタンスの実装


php、nts の ts バージョンと nts バージョンの違いについて言及する必要があります。 (非スレッドセーフ) シングルスレッド構造、スレッド間でキャッシュデータを共有。 ts (スレッド セーフ) はマルチスレッド機能を備えて構築されており、複数のスレッド間で異なるデータ コピーを使用します。

php の ts バージョンを使用して、スレッド セーフ モードに自動的にアップグレードします。pthreads 拡張機能は、php の ts バージョンにのみインストールできます。

pecl に含まれる pthreads の最後のバージョンは php7.0 に基づいています。github の pthreads プロジェクトも更新を停止しました。興味がある場合は、7.0 にアクセスするだけで履歴を見逃すことができます。

pthreads 拡張機能を php-7.0.9-Win32-VC14-x64 バージョンにインストールしました。

マルチスレッドの場合、シングルトンのスコープはプロセスのみからスレッドのみに変わります。

require 'single.php';
class Request extends Thread {
    public $url;
    public function __construct($url) {
        $this->url = $url;
    }
    public function run() {
        echo single::getInstance()->getId();
        echo "\n";
    }
}
$chG = new Request("www.google");
$chG ->start();
$chG->join();
echo $chG->getThreadId();
echo "\n";
$chB = new Request("www.baidu");
$chB ->start();
$chB->join();
echo $chB->getThreadId();
echo "\n";

ここでは 2 つのスレッドが作成されますが、0 から始まる ID は両方の実行で取得できます。これは、2 つのスレッドの単一クラスが 2 つの異なるシングルトン オブジェクトであることを示しています。


#概要

PHP のシングルトン モードを実装するには 3 つの手順が必要です

* 静的メンバー変数はクラスを保存するために使用されます。

* __construct と __clone は、作成やクローン作成を防ぐためにプライベートとして宣言されています。

* このインスタンスにアクセスするために使用される静的メソッド (通常は getInstance)。

私は PHP でマルチスレッドを使用したことがありません。それはもう後戻りできないことのようです。みんながどう思うかわかりません。

以上が【デザインパターン】PHPシングルトンパターンの応用シナリオと実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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