php单例模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php单例模式相关的知识,希望对你有一定的参考价值。

单例模式


所谓的单例模式简而言之就是某个类在运行过程中只有一个实例,并且能够自行实例化并为整个系统的运行提供这个实例。
在数据库连接中使用单例模式实例化数据库连接对象主要是可以避免重复的实例化对象而造成资源的浪费。

php实现数据库连接对象单例模式主要包括三点:

1 需要一个保存类的唯一实例静态成员变量,一般为$_instance private变量;
private $_instance;

2 构造函数和克隆函数必须声明为私有,防止被外部实例化类;
private function __construct{

}
private function __clone(){

}

3 必须提供一个访问这个实例的公共静态方法,一般为getInstance方法,且返回一个实例的引用;
static public function getInstance(){
  if(is_null(self::$_instance) || !isset(self::$_instance)){
     self::$_instance = new DB();
  }
   return self::$_instance;
}
*/

php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。

 

<?php
/**
* $_instance必须声明为静态的私有变量
* 构造函数和析构函数必须声明为私有,防止外部程序new
* 类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法
* 以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。 

* 使用单例模式生成一个对象后,
* 该对象可以被其它众多对象所使用。 
**/
$db = array(  
        ‘host‘=>‘localhost‘,  
        ‘user‘=>‘root‘,  
        ‘password‘=>‘‘,  
        ‘database‘=>‘test‘,  
);  
class db {  
    private $conn;  
    public static $sql;  
    private static $instance;  
    private function __construct(){  
        $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);         
    }  
     //创建__clone方法防止对象被复制克隆
    private function __clone(){
        //trigger_error(‘Clone is not allow!‘,E_USER_ERROR);
    }
    //单例方法,用于访问实例的公共的静态方法
    public static function getInstance(){  
        if(is_null(self::$instance)){  // !(self::$_instance instanceof self)
            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();  

 

以上是关于php单例模式的主要内容,如果未能解决你的问题,请参考以下文章

PHP设计模式之:单例模式

PHP设计模式------单例模式

设计模式之单例模式

php设计模式-单例模式

php的单例模式

php单例模式与工厂模式