1、什麼是單例模式?php
一、含義 mysql
做爲對象的建立模式,單例模式確保某一個類只有一個實例,並且自行實例化並向整個系統全局地提供這個實例。它不會建立實例副本,而是會向單例類內部存儲的實例返回一個引用。sql
二、單例模式的三個要點:數據庫
(1). 須要一個保存類的惟一實例的靜態成員變量:
asp.net
- private static $_instance;
(2). 構造函數和克隆函數必須聲明爲私有的,防止外部程序new類從而失去單例模式的意義:
函數
- private function __construct()
- {
- $this->_db = pg_connect('xxxx');
- }
- private function __clone()
- {
- }
-
(3). 必須提供一個訪問這個實例的公共的靜態方法(一般爲getInstance方法),從而返回惟一實例的一個引用 post
- public static function getInstance()
- {
- if(! (self::$_instance instanceof self) )
- {
- self::$_instance = new self();
- }
- return self::$_instance;
-
- }
2、爲何要使用單例模式?fetch
一、PHP缺點:
ui
PHP語言是一種解釋型的腳本語言,這種運行機制使得每一個PHP頁面被解釋執行後,全部的相關資源都會被回收。也就是說,PHP在語言級別上沒有辦法讓某 個對象常駐內存,這和asp.net、Java等編譯型是不一樣的,好比在Java中單例會一直存在於整個應用程序的生命週期裏,變量是跨頁面級的,真正可 以作到這個實例在應用程序生命週期中的惟一性。然而在PHP中,全部的變量不管是全局變量仍是類的靜態成員,都是頁面級的,每次頁面被執行時,都會從新建 立新的對象,都會在頁面執行完畢後被清空,這樣彷佛PHP單例模式就沒有什麼意義了,因此PHP單例模式我以爲只是針對單次頁面級請求時出現多個應用場景 並須要共享同一對象資源時是很是有意義的。this
二、單例模式在PHP中的應用場合:
(1)、應用程序與數據庫交互
一個應用中會存在大量的數據庫操做,好比過數據庫句柄來鏈接數據庫這一行爲,使用單例模式能夠避免大量的new操做,由於每一次new操做都會消耗內存資源和系統資源。
(2)、控制配置信息
若是系統中須要有一個類來全局控制某些配置信息, 那麼使用單例模式能夠很方便的實現.
3、如何實現單例模式?
一、普通的數據庫訪問例子:
- <?php
- ......
- $db = new DB(...);
-
- $db->addUserInfo(...);
-
- ......
-
- function getUserInfo()
- {
- $db = new DB(...);
- $db = query(....);
- }
-
- ?>
二、應用單例模式對數據庫進行操做:
- <?php
-
- class DB
- {
- private $_db;
- private static $_instance;
-
- private function __construct(...)
- {
- $this->_db = pg_connect(...);
- }
-
- private function __clone() {};
-
- public static function getInstance()
- {
- if(! (self::$_instance instanceof self) ) {
- self::$_instance = new self();
- }
- return self::$_instance;
- }
-
-
-
- public function addUserInfo(...)
- {
-
-
-
- }
-
- public function getUserInfo(...)
- {
-
- }
-
- }
-
-
- $db = DB::getInstance();
-
- $db->addUserInfo(...);
-
- $db->getUserInfo(...);
-
-
- ?>
三、深刻理解
- <?php
- class db {
- public $conn;
- public static $sql;
- public static $instance=null;
- private function __construct(){
- require_once('db.config.php');
- $this->conn = mysql_connect($db['host'],$db['user'],$db['password']);
- if(!mysql_select_db($db['database'],$this->conn)){
- echo "失敗";
- };
- mysql_query('set names utf8',$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='';
- if(!empty($condition)){
-
- foreach($condition as $k=>$v){
- $where.=$k."='".$v."' and ";
- }
- $where='where '.$where .'1=1';
- }
- $fieldstr = '';
- if(!empty($field)){
-
- foreach($field as $k=>$v){
- $fieldstr.= $v.',';
- }
- $fieldstr = rtrim($fieldstr,',');
- }else{
- $fieldstr = '*';
- }
- 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 = '';
- $datas = '';
- foreach($data as $k=>$v){
- $values.=$k.',';
- $datas.="'$v'".',';
- }
- $values = rtrim($values,',');
- $datas = rtrim($datas,',');
- 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='';
- if(!empty($condition)){
-
- foreach($condition as $k=>$v){
- $where.=$k."='".$v."' and ";
- }
- $where='where '.$where .'1=1';
- }
- $updatastr = '';
- if(!empty($data)){
- foreach($data as $k=>$v){
- $updatastr.= $k."='".$v."',";
- }
- $updatastr = 'set '.rtrim($updatastr,',');
- }
- self::$sql = "update {$table} {$updatastr} {$where}";
- return mysql_query(self::$sql);
- }
-
- public function delete($table,$condition){
- $where='';
- if(!empty($condition)){
-
- foreach($condition as $k=>$v){
- $where.=$k."='".$v."' and ";
- }
- $where='where '.$where .'1=1';
- }
- self::$sql = "delete from {$table} {$where}";
- return mysql_query(self::$sql);
-
- }
-
- public static function getLastSql(){
- echo self::$sql;
- }
-
-
-
- }
-
- $db = db::getInstance();
- echo $db->delete('demo',array('id'=>'2'));
- db::getLastSql();
- echo "<pre>";
- ?>