PHP单例方式学习笔记详解,X的单件情势

作者: 关于计算机  发布:2019-09-26

X的纵然文件初始都有那样一句话

1.单例格局的定义

 代码如下

从名称想到所饱含的意义,单例形式独有多个实例,并且自行实例化,向全局提供那一个实例。必要重申的是,单例形式

$discuz = & discuz_core::instance();
[code language=php]

保障有些类只好有二个实例!

 

2.单例方式的多个要点

// instance()属于discuz_core类在class_core.php
function &instance() {
static $object;
if(empty($object)) {
  $object = new discuz_core();
}
return $object;
}
[/code]
此处保障单词央求都施用三个discuz_core实例。这里的&写法是为着合营PHP4的,假设在PHP5中,则能够动用static。
[code language=php]
//这里是单件情势的粗略例子。
class PHPig {
private static $v = null;
static function instance() {
  if(self::$v == null) {
   self::$v = new PHPig();
  }
  return self::$v;
}
}
$pig1 = PHPig::instance();
$pig2 = PHPig::instance();
if($pig1 === $pig2) {
echo '同叁个指标';
} else {
echo '不是同贰个指标';
}
[/code]

(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.什么落实单例形式

 代码如下

<?php
/**
 * 单例方式示例:德姆o
 */
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、普通的数据库访谈例子:

 代码如下

<?php
......
//开始化三个数据库句柄
$db = new DB(...);

//加多客商新闻
$db->addUserInfo(...);

......

//在函数中拜候数据库,查找客商信息
function getUserInfo()
{
    $db = new DB(...);//再次new 数据库类,和数据库创建连接
    $db = query(....);//依据查询语句访谈数据库
}

?>

2、应用单例格局对数据库举办操作:

 代码如下

<?php

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

?>

深切领悟

 代码如下

<?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中有好多的设计方式,当中的单例格局是我们写代码的时候比较常用的一种形式,它不光能

够有效的削减new操作的能源消耗,并且能够很有益于的对有些全局配置音信实行支配!希望大家在php学

习中长远明白单例方式的行使。

本文由金沙澳门官网送注册58发布于关于计算机,转载请注明出处:PHP单例方式学习笔记详解,X的单件情势

关键词: