PHP设计模式之——单例模式

首先我们看一个这样的应用场景:

我们打开jd.com京东商城的官网首页,我们看到很多商城里的数据。我们知道页面的数据来源于数据库(亦或是缓存),从页面而看,数据分成了不同的模块,如下图。


PHP设计模式之——单例模式_第1张图片


那么问题来了,不同模块的数据,是怎么通过一个请求资源来请求的呢?换句话说,如果每一个sql都要执行一次数据库连接,这将会是很多次连接,那么是怎么做到一个请求使用一个连接来处理的呢?

有几种处理方式,java和.Net(C#)等这样编译型的语言,可以在编译后,把连接作为内存常驻的资源,这样请求来了的时候,可以使用内存中使用的唯一连接资源;也有连接池这样的方式,将很多的连接资源放到一个公共的连接池当中,当有需要的时候从中取出一个来进行业务处理。对于PHP这样的解释型语言的页面级请求来说,页面请求结束,PHP进程运行完成以后会释放所有资源,而新的请求进来还会再次创建局部与全局变量,也就是在一次请求中连接需要作为唯一资源。以上几种方式,都需要将连接作为唯一的一个实例来处理,也就是——单例模式。


什么是单例?

单例,作为对象的一个创建模式,确保某一个类只有一个实例,而且自行实例化并向整个系统全局提供这个唯一实例。不会创建实例的复制,而是会向单例类内部存储的实例返回一个引用。

单例模式有三个条件:

1,需要保存类唯一实例的静态成员变量

2,构造函数和析构函数声明以及clone为私有,防止外部能够new这个类或者克隆唯一实例,而失去单例的意义

3,要有一个公用的访问这个实例的静态方法


什么时候要用到单例模式呢?

1,应用程序与数据库或者缓存进行交互

2,控制配置信息


如何实现单例呢?

话不多说,直接上代码

<?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();  
//$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 "<pre>";  



你可能感兴趣的:(PHP设计模式之——单例模式)