首頁 > 後端開發 > php教程 > 一招解決 PHP 單例模式解析與實戰

一招解決 PHP 單例模式解析與實戰

慕斯
發布: 2023-04-10 09:54:01
轉載
2351 人瀏覽過

我們學會了解了這麼多關於PHP的知識,今天學習如何一招解決PHP 單例模式解析和實戰,不知你們是否已經完全掌握了呢,如果沒有,那就跟隨本篇文章一起繼續學習吧

一、什麼是單例模式?

1、意義  



   作為物件的建立模式,單例模式確保某一個類別只有一個實例,並且自行實例化並向整個系統全域提供這個實例。它不會建立實例副本,而是會向單例類別內部儲存的實例傳回一個參考。

2、單例模式的三個要點:

(1).需要一個保存類別的唯一實例的靜態成員變數:

private static $_instance;
登入後複製

(2). 建構子與複製函數必須宣告為私有的,防止外部程式new類別從而失去單例模式的意義:

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;  

    }
登入後複製
二、為什麼要使用單例模式? 1、PHP缺點:

#        

####################### ######        PHP語言是一種解釋型的腳本語言,而這個運作機制使得每個PHP頁面都被解釋執行後,所有的相關資源都會被回收。也就是說,PHP在語言層級上沒有辦法讓某個物件常駐內存,這和asp.net、Java等編譯型是不同的,例如在Java中單例會一直存在於整個應用程式的生命週期裡,變數是跨頁面層級的,真正可以做到這個實例在應用程式生命週期中的唯一性。然而在PHP中,所有的變數無論是全域變數或類別的靜態成員,都是頁面層級的,每次頁面被執行時,都會重新建立新的對象,都會在頁面執行完畢後被清空,這樣似乎PHP單例模式就沒有什麼意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現多個應用場景並需要共享同一對象資源時是非常有意義的。 ###############2、單例模式在PHP中的應用場合:####################### ####(1)、應用程式與資料庫互動#################################        一個應用程式中會存在大量的資料庫操作,例如過資料庫句柄來連接資料庫這一行為,使用單例模式可以避免大量的new操作,因為每一次new操作都會消耗記憶體資源和系統資源。 ###########################(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 單例模式解析與實戰的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板