ホームページ > バックエンド開発 > PHPチュートリアル > PHPシングルトンパターンの定義と使用例を詳しく解説

PHPシングルトンパターンの定義と使用例を詳しく解説

墨辰丷
リリース: 2023-03-28 07:52:02
オリジナル
1539 人が閲覧しました

この記事では、PHP シングルトン モードの定義と使用方法を主に紹介し、具体的なデータベース操作クラスの形式に基づいて、PHP シングルトン モードの機能、定義、使用方法、および関連する注意事項を詳細に分析します。

詳細は次のとおりです:

まず、シングルトン モードについて簡単に紹介します。

シングルトンモードは、アプリケーション内で特定のクラスのインスタンスを1つだけ保持するモードであり、外部環境の影響により、このクラスの2番目のインスタンスを生成することはできません。実用的な観点から見た利点は、WEB 開発において単一のデータ操作クラス インスタンスの存在を維持する場合、大規模なソフトウェア開発において不必要な冗長な接続データベース リソースの消費を削減できることです。維持するシングルトン シングルトンは常にメモリを占有し、コピーを持たないため、プログラムの状態はさまざまな操作を同期します。

PHP の場合、シングルトンを使用する最も一般的な機会は、データベース操作クラスを作成することです。ただし、PHP でシングルトンを実装する場合は、次のルールがあります:

1) シングルトン クラスには、現在宣言されているコンストラクターがあり、プライベートである必要があります。

2) シングルトン クラスのインスタンスが 1 つだけ存在するように、シングルトン クラスにはクラスのインスタンスを格納するための静的変数が必要です。

3) シングルトン クラスは、このシングルトンを適用するために他のすべてのオブジェクトに静的メソッドを提供する必要があります。

上記の 3 つの条件が満たされる理由:

1) シングルトン クラスはアプリケーション全体の実行中に 1 回しか作成できず、この作成は外部呼び出しによって完了するのではなく、それ自体で完了するためです。したがって、シングルトン クラスはそれ自体をインスタンス化するため、そのコンストラクターはプライベートである必要があります。他の外部オブジェクトは、シングルトン クラスのコピーを再度構築することはできません。

2) シングルトン クラスはそれ自体をインスタンス化することしかできず、すべての外部アプリケーションに独自のインスタンスを提供する必要があるため、クラス内には外部からアクセスできる内部アクセス ポイントが必要であり、それがクラス内への唯一の定常アクセス ポイントです。したがって、シングルトン クラス自体がインスタンス化するインスタンス オブジェクトを格納するには、静的変数を指定する必要があります。

3) シングルトン クラスのコンストラクターはプライベートであるため、シングルトン クラスは、シングルトン クラスを呼び出すための外部環境に対する外部インターフェイスを提供する必要があります。そのため、シングルトン クラスを初期化するか、シングルトン クラスを返すことができる静的メソッドが必要です。オブジェクトへの参照。

簡単な例:

class DB{
   private $_link;
   //   保持单例类的静态变量
   static $_instance;
   //   私有的构造函数
   private function __construct(){
       $this->_link = @mysqli_connect(__HOST__, __USER__, __PASSWORD__, __DATABASE__);
       if(! ($this->_link)){
          echo 'Something wrong occurs on the database connection!';  
       }
   }
   //   防止单例类被克隆
   private function __clone(){}
   //   外界访问单例类实例的接口
   public static function getInstance(){
       if(! (self::$_instance instanceof self)){
          self::$_instance = new self();
       }
       return self::$_instance;
   }
}
ログイン後にコピー

上記で定義された __clone() 関数は、シングルトン クラス オブジェクトのクローン作成を防止することに注意してください。

以下も参照用のデータベース操作クラスの単純なシングルトンです:

class DB {
   /**
    * the database connection
    * @var   resource
    * @access private
    */
   private $_link;
   /**
    * the static instance of single db
    * @var   object
    * @access static
    */
   static $_instance;
   /**
    * construct the single object
    * @return null
    * @access private
    */
   private function __construct(){
       $this->_link = @mysqli_connect(__HOST__, __USER__, __PASSWORD__, __DATABASE__);
       if(! ($this->_link)){
          echo 'Something wrong occurs on the database connection!';  
       }
   }
   /**
    * empty clone
    * @return null
    * @access private
    */
   private function __clone(){}
   /**
    * for other object to get the instance of db
    * @return self::instance
    * @access public
    */
   public static function getInstance(){
       if(! (self::$_instance instanceof self)){
          self::$_instance = new self();
       }
       return self::$_instance;
   }
   /**
    * query
    * @param  sql string
    * @param  message string
    * @return   resource
    * @access public
    */
   public function query($sql,$message){
       $result = @mysqli_query($this->$_link, $sql) or die($message . mysqli_error($this->$_link));
       return $result;
   }
   /**
    * mysqli_num_rows
    * @param  result resource
    * @return   int
    * @access public
    */
   public function num($result){
       return @mysqli_num_rows($result);
   }
   /**
    * mysqli_fetch_array
    * @param  result resource
    * @return   array
    * @access public
    */
   public function fetchArr($result){
       return @mysqli_fetch_array($result);
   }
   /**
    * mysqli_insert_id
    * @return   int
    * @access public
    */
   public function last_id(){
       return @mysqli_insert_id($this->_link);   
   }
   /**
    * close the database connection
    * @param  result resource
    * @return   null
    * @access public
    */
   public function close(){
       @mysqli_close($this->_link);
   }
   /**
    * fetch once result from the specific sql query
    * @param  sql string
    * @param  message string
    * @return   array
    * @access public
    */
   public function fetchArrOnce($sql, $message){
       $result = $this->query($sql, $message);
       $row = $this->fetchArr($result);
       return $row;
   }
   /**
    * fetch all results from the specific sql query
    * @param  sql string
    * @param  message string
    * @return   array
    * @access public
    */
   public function fetchArrMore($sql, $message){
       $result = $this->query($sql, $message);
       $moreRow = array();
       while($row = $this->fetchArr($result)){
          $moreRow[] = $row;
       }
       return $moreRow;
   }
   /**
    * fetch the number of results from the specific sql query
    * @param  sql string
    * @param  message string
    * @return   array
    * @access public
    */
   public function fetchNum($sql, $message){
       $result = $this->query($sql, $message);
       $resultNum = $this->num($result);
       return $resultNum;
   }
   /**
    * mysqli_prepare
    * @param  sql string
    * @return   stmt object
    * @access public
    */
   public function prepare($sql){
       return @mysqli_prepare($this->_link, $sql);
   }
   /**
    * mysqli_stmt_execute
    * @param  stmt object
    * @param  message string
    * @return   bool
    * @access public
    */
   public function stmt_execute($stmt, $message){
       @mysqli_stmt_execute($stmt) or die($message . mysqli_error($this->_link));
   }
}
ログイン後にコピー

Use:

define("__HOST__", "localhost");
define("__USER__", "root");
define("__PASSWORD__", "");
define("__DATABASE__", "eee");
$db = DB::getInstance();
ログイン後にコピー

上記がこの記事の全内容です。みんなの勉強に役立ちます。


関連する推奨事項:

phpの基本デザインパターン(登録ツリーモード、ファクトリモード、シングルカラムモード)、デザインパターンシングルカラム_PHPチュートリアル

PHPオブジェクト指向-シングルカラムモード

HP基本デザインパターン(登録ツリーモード、ファクトリーモード、シングルカラムモード)、デザインモードシングルカラム

以上がPHPシングルトンパターンの定義と使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート