ホームページ  >  記事  >  バックエンド開発  >  PHPシングルトンパターン分析と実践的な戦闘を解決するための1つのトリック

PHPシングルトンパターン分析と実践的な戦闘を解決するための1つのトリック

慕斯
慕斯転載
2021-06-30 09:49:212160ブラウズ

私たちは PHP についてたくさんのことを学びました。今日は、PHP シングルトン モードの分析と実際の戦闘を 1 つのステップで解決する方法を学びます。完全にマスターできたでしょうか。そうでない場合は、次の手順に従ってください。この記事 この記事で学習を続けましょう

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

#1. 意味

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

2. シングルトン パターンの 3 つの重要なポイント:

(1)。クラスの唯一のインスタンスを保存するには、静的メンバー変数が必要です:

private static $_instance;

(2).

コンストラクターとclone 関数は、新しいクラスからの外部プログラムが使用され、シングルトン モードの意味が失われるのを防ぐために、プライベートとして宣言する必要があります:

private function __construct() 
{ 
    $this->_db = pg_connect('xxxx');
} 
private function __clone()
{
}//覆盖__clone()方法,禁止克隆

(3)。これにアクセスするためのパブリック静的メソッドインスタンスを指定する必要があります (通常は getInstance メソッド)。したがって、唯一のインスタンスへの参照が返されます。

    public static function getInstance()  
    {  
        if(! (self::$_instance instanceof self) ) 
        {  
            self::$_instance = new self();  
        }
        return self::$_instance;  

    }

2. シングルトン モードを使用する理由は何ですか?

1. PHP の欠点:

PHP 言語はインタープリタ型スクリプト言語であり、この動作メカニズムにより、各 PHP ページが解釈および実行された後に、関連するすべてのリソースをリサイクルできます。言い換えれば、PHP には、オブジェクトを言語レベルでメモリに常駐させる方法がありません。これは、asp.net や Java などのコンパイル型とは異なります。たとえば、Java では、シングルトンは、オブジェクトのライフ サイクル全体を通じて常に存在します。変数はページ全体のレベルであり、アプリケーションのライフサイクル内でこのインスタンスを真に一意にすることができます。ただし、PHP では、グローバル変数であろうとクラスの静的メンバーであろうと、すべての変数はページ レベルであり、ページが実行されるたびに、新しいオブジェクトが再確立され、ページの実行後にクリアされます。 PHP のシングルトン モードは意味がないようなので、単一のページ レベルのリクエストで複数のアプリケーション シナリオが発生し、同じオブジェクト リソースを共有する必要がある場合にのみ、PHP シングルトン モードが非常に意味があると思います。

#2. PHP でのシングルトン モードの適用場面:


(1)、アプリケーションとデータベースの相互作用

## アプリケーションの操作は多数あります。データベース ハンドルを介したデータベースへの接続など、データベース操作の負荷を軽減します。新しい操作のたびにメモリ リソースとシステム リソースが消費されるため、シングルトン モードを使用すると、多数の新しい操作を回避できます。
#(2)、制御構成情報

        如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现.

三、如何实现单例模式?

1、普通的数据库访问例子:

<?php
......
//初始化一个数据库句柄
$db = new DB(...);

//添加用户信息
$db->addUserInfo(...);

......

//在函数中访问数据库,查找用户信息
function getUserInfo()
{
    $db = new DB(...);//再次new 数据库类,和数据库建立连接
    $db = query(....);//根据查询语句访问数据库
}

?>

2、应用单例模式对数据库进行操作:

<?php

class DB  
{  
    private $_db;  
    private static $_instance;  
  
    private function __construct(...)  
    {  
        $this->_db = pg_connect(...);//postgrsql  
    }  
  
    private function __clone() {};  //覆盖__clone()方法,禁止克隆  
  
    public static function getInstance()  
    {  
        if(! (self::$_instance instanceof self) ) {  
            self::$_instance = new self();  
        }  
        return self::$_instance;  
    }  
  
    

    public function addUserInfo(...)
    {

   

    }

     public function getUserInfo(...)
    { 

    }

}

//test

$db = DB::getInstance();

$db->addUserInfo(...);

$db->getUserInfo(...);


?>

3、深入理解

<?php
class db {
	public $conn;
	public static $sql;
	public static $instance=null;
	private function __construct(){
		require_once(&#39;db.config.php&#39;);
		$this->conn = mysql_connect($db[&#39;host&#39;],$db[&#39;user&#39;],$db[&#39;password&#39;]);
		if(!mysql_select_db($db[&#39;database&#39;],$this->conn)){
			echo "失败";
		};
		mysql_query(&#39;set names utf8&#39;,$this->conn);		
	}
	public static function getInstance(){
		if(is_null(self::$instance)){
			self::$instance = new db;
		}
		return self::$instance;
	}
	/**
	 * 查询数据库
	 */
	public function select($table,$condition=array(),$field = array()){
		$where=&#39;&#39;;
		if(!empty($condition)){
			
			foreach($condition as $k=>$v){
				$where.=$k."=&#39;".$v."&#39; and ";
			}
			$where=&#39;where &#39;.$where .&#39;1=1&#39;;
		}
		$fieldstr = &#39;&#39;;
		if(!empty($field)){
			
			foreach($field as $k=>$v){
				$fieldstr.= $v.&#39;,&#39;;
			}
			 $fieldstr = rtrim($fieldstr,&#39;,&#39;);
		}else{
			$fieldstr = &#39;*&#39;;
		}
		self::$sql = "select {$fieldstr} from {$table} {$where}";
		$result=mysql_query(self::$sql,$this->conn);
		$resuleRow = array();
		$i = 0;
		while($row=mysql_fetch_assoc($result)){
			foreach($row as $k=>$v){
				$resuleRow[$i][$k] = $v;
			}
			$i++;
		}
		return $resuleRow;
	}
	/**
	 * 添加一条记录
	 */
	 public function insert($table,$data){
	 	$values = &#39;&#39;;
	 	$datas = &#39;&#39;;
	 	foreach($data as $k=>$v){
	 		$values.=$k.&#39;,&#39;;
	 		$datas.="&#39;$v&#39;".&#39;,&#39;;
	 	}
	 	$values = rtrim($values,&#39;,&#39;);
	 	$datas   = rtrim($datas,&#39;,&#39;);
	 	self::$sql = "INSERT INTO  {$table} ({$values}) VALUES ({$datas})";
		if(mysql_query(self::$sql)){
			return mysql_insert_id();
		}else{
			return false;
		};
	 }
	 /**
	  * 修改一条记录
	  */
	public function update($table,$data,$condition=array()){
		$where=&#39;&#39;;
		if(!empty($condition)){
			
			foreach($condition as $k=>$v){
				$where.=$k."=&#39;".$v."&#39; and ";
			}
			$where=&#39;where &#39;.$where .&#39;1=1&#39;;
		}
		$updatastr = &#39;&#39;;
		if(!empty($data)){
			foreach($data as $k=>$v){
				$updatastr.= $k."=&#39;".$v."&#39;,";
			}
			$updatastr = &#39;set &#39;.rtrim($updatastr,&#39;,&#39;);
		}
		self::$sql = "update {$table} {$updatastr} {$where}";
		return mysql_query(self::$sql);
	}
	/**
	 * 删除记录
	 */
	 public function delete($table,$condition){
	 	$where=&#39;&#39;;
		if(!empty($condition)){
			
			foreach($condition as $k=>$v){
				$where.=$k."=&#39;".$v."&#39; and ";
			}
			$where=&#39;where &#39;.$where .&#39;1=1&#39;;
		}
		self::$sql = "delete from {$table} {$where}";
		return mysql_query(self::$sql);
		
	 }
	
	public static function getLastSql(){
		echo self::$sql;
	}
	
	
	
}

$db = db::getInstance();
//$list = $db->select(&#39;demo&#39;,array(&#39;name&#39;=>&#39;tom&#39;,&#39;password&#39;=>&#39;ds&#39;),array(&#39;name&#39;,&#39;password&#39;));
//echo $db->insert(&#39;demo&#39;,array(&#39;name&#39;=>&#39;最近你啦&#39;,&#39;password&#39;=>&#39;123&#39;));
//echo $db->update(&#39;demo&#39;,array("name"=>&#39;xxx&#39;,"password"=>&#39;123&#39;),array(&#39;id&#39;=>1));
echo $db->delete(&#39;demo&#39;,array(&#39;id&#39;=>&#39;2&#39;));
db::getLastSql();
echo "<pre class="brush:php;toolbar:false">";
?>

推荐学习:《PHP视频教程

以上がPHPシングルトンパターン分析と実践的な戦闘を解決するための1つのトリックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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