手记

PHP设计模式-单例模式

单例模式(职责模式):

简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务;

单例类:

1、构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;

2、拥有一个保存类的实例的静态成员变量

3、拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)

另外,需要创建__clone()方法防止对象被复制(克隆)

为什么要使用PHP单例模式?

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

2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。

3、在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。


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;    

}  


调用 $danli = Danli::getInstance();
        $danli->方法名();


深入解析单例模式的使用:db类

<?php
class db{
    public $mysql_server_name="localhost";
    public $mysql_username="root";
    public $mysql_password="";
    public $mysql_database="test";
    public $conn;  
    public static $sql;  
    public static $instance=null;
    
    public function __construct(){   
        $conn=mysql_connect($this->mysql_server_name,$this->mysql_username,$this->mysql_password) or die("error connecting");
        mysql_query("set names 'utf8'");
        $his->conn=mysql_select_db($this->mysql_database); //打开数据库
        return $this->conn=$conn;
    }

    public static function getInstance(){  
        if(is_null(self::$instance)){  
            self::$instance = new db;  
        }  
        return self::$instance;  
    }  

    private function __clone()  
    {
        //防止被克隆;
    }  

    /**
     * 查询数据库
     */  
    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;  
    }  
}

$abc=db::getInstance();

//var_dump($abc->select('text')); //-查询-
//$abc->insert('text',array('name'=>'haha')); //-增加-
//$abc->update('text',array('name'=>'hehe'),array('id'=>'4')); //-更新-
$abc->delete('text',array('id'=>'4')); //-删除-

$abc->getLastSql();

?>

1人推荐
随时随地看视频
慕课网APP