ホームページ > php教程 > php手册 > PHP单例模式学习笔记详解

PHP单例模式学习笔记详解

WBOY
リリース: 2016-06-13 10:16:59
オリジナル
1459 人が閲覧しました

单例模式是php中一个为了简化大家开发及重复调用的一个功能,下面我来给各位朋友详细介绍单例模式用法。

1.单例模式的概念

顾名思义,单例模式只有一个实例,而且自行实例化,向全局提供这个实例。需要强调的是,单例模式

确保某个类只能有一个实例!

2.单例模式的三个要点

(1)需要一个静态变量来保存类的唯一实例

 代码如下 复制代码

private static $_instance;

(2)构造函数和克隆函数必须为私有的,防止用户创建对象和复制实例对象

 代码如下 复制代码

private function __construct()
{
//私有化默认构造方法,防止外界直接实例化
}
private function __clone()
{
//私有化克隆方法,防止用户复制实例
}

(3)必须提供一个公共的静态方法(一般为getInstance),从而返回一个唯一实例的引用

 代码如下 复制代码
public static function getInstance()   
{   
    if(! (self::$_instance instanceof self) )  
    {   
        self::$_instance = new self();   
    } 
    return self::$_instance;   
 
}

3.php中使用单例模式的原因
       PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资

源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译

型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可

以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静

态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,

这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个

应用场景并需要共享同一对象资源时是非常有意义的。

4.如何实现单例模式

 代码如下 复制代码

/**
 * 单例模式示例:Demo
 */
class Demo{
 //静态成员变量,用来保存全局实例
 private static $_instance;
 //私有化构造方法,保证外界不能直接实例化
 private function __construct(){

 }
 //私有化克隆方法,防止用户复制实例
 private function __clone(){

 }
 //返还此类的唯一实例
 public function getInstance(){
  if(!(self::$_instance instanceof self))
  {
   self::$_instance = new self();
  }
  return self::$_instance;
 }
 //这是第一个测试方法
 public function test1Function(){
  echo '这是第一个测试方法';
 }
 //这是第二个测试方法
 public function test2Function(){
  echo '这是第二个测试方法';
 }
}
//正确的使用方法
@$demo = Demo::getInstance();
$demo->test1Function();
$demo->test2Function();
//这样实例化会出错,因为构造方法为private
//$demo_new = new Demo;
//复制demo会出错,因为默认的clone方法为private
// $demo_clone = clone $demo;
?>

5.单利模式的应用场合


(1)应用与数据库的交互,多用于数据库的连接
(2)如果系统中需要一个类来全局控制配置信息,用单例模式可以很方便的实现


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

 代码如下 复制代码

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

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

......

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

?>

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

 代码如下 复制代码


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(...);


?>

深入理解

 代码如下 复制代码

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();
//$list = $db->select('demo',array('name'=>'tom','password'=>'ds'),array

('name','password'));
//echo $db->insert('demo',array('name'=>'最近你啦','password'=>'123'));
//echo $db->update('demo',array("name"=>'xxx',"password"=>'123'),array('id'=>1));
echo $db->delete('demo',array('id'=>'2'));
db::getLastSql();
echo "

";<br>
?>
ログイン後にコピー

       php中有很多的设计模式,其中的单例模式是我们写代码的时候较为常用的一种模式,它不但能

够有效的减少new操作的资源消耗,而且能够很方便的对某些全局配置信息进行控制!希望大家在php学

习中深刻理解单例模式的应用。

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