好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHP单例模式学习笔记详解 - php高级应用

PHP单例模式学习笔记详解

单例模式是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.如何实现单例模式, 代码如下:

<?php  /**    * 单例模式示例: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、普通的数据库访问例子, 代码如下:

<?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 empty ( $condition )){           foreach ( $condition   as   $k => $v ){       $where .= $k . "='" . $v . "' and " ;     }      $where = 'where ' . $where  . '1=1' ;    }     $fieldstr  =  '' ;     if (! empty 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 empty ( $condition )){           foreach ( $condition   as   $k => $v ){       $where .= $k . "='" . $v . "' and " ;     }      $where = 'where ' . $where  . '1=1' ;    }     $updatastr  =  '' ;     if (! empty 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 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学习中深刻理解单例模式的应用。

查看更多关于PHP单例模式学习笔记详解 - php高级应用的详细内容...

  阅读:50次