PHP中单例模式的示例分析
这篇文章将为大家详细讲解有关PHP中单例模式的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一、什么是单例模式?
含义
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
单例模式的三个要点:
(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; }
二、为什么要使用单例模式?
PHP缺点:
PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。
单例模式在PHP中的应用场合:
(1)、应用程序与数据库交互
一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源。
(2)、控制配置信息
如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现.
三、如何实现单例模式?
普通的数据库访问例子:
<?php......//初始化一个数据库句柄$db = new DB(...);//添加用户信息$db->addUserInfo(...);......//在函数中访问数据库,查找用户信息function getUserInfo(){ $db = new DB(...);//再次new 数据库类,和数据库建立连接 $db = query(....);//根据查询语句访问数据库}?>
应用单例模式对数据库进行操作:
<?phpclass 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(...);?>
深入理解
<?phpclass 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中单例模式的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341