本文实例讲述了PHP单例模式定义与使用。分享给大家供大家参考,具体如下:
先简单的介绍一下单例模式。单例模式就是在应用程序中保持某一个类实例只存在一个,而且不可以受外部环境的影响而生成这个类的第二个实例。它的优点,实际点见,如果在WEB开发中,保持单一个数据操作类实例的存在,可以减少不必要的多余连接数据库资源的消耗,对于大型的软件开发来说,可以使用单例来维持程序的状态,使不同操作实现同步,因为单例一直占据内存,而从不会有副本。
而对于PHP,使用单例最常用的场合莫过于写一个数据库操作类。不过在PHP中实现单例,有以下规则:
1)单例类必须拥有一个现式声明的构造函数,并且是私有的。
2)单例类必须有一个静态变量来存储类的实例,这样可以保持这个单例类就只有那么一个实例。
3)单例类必须提供一个静态方法,供其他所有的对象应用这个单例。
为什么要满足以上三个条件呢:
1)因为单例类在整个应用程序运行时,只能被创造一次,而且这种创造是不是通过外部调用而完成,而是自身完成。所以单例类是自己实例化自己,所以其构造函数必须是私有。任何其他外部对象都不可以再次构造一个单例类的副本。
2)因为单例类只能够自己实例化自己,而又要为所有外部应用提供自己的实例,所以类内部必须有一个可供外界访问,而又是唯一不变的访问存储对象点,所以要提供一个静态变量去存储单例类自己实例化自己的那个实例对象。
3)因为单例类的构造函数是私有的,所以单例类必须提供一个外部接口供外部环境调用单例类,所以必须有一个静态方法,它可以初始化单例类或者返回单例类的对象的引用。
一个简单的例子:
class DB{ private $_link; // 保持单例类的静态变量 static $_instance; // 私有的构造函数 private function __construct(){ $this->_link = @mysqli_connect(__HOST__, __USER__, __PASSWORD__, __DATABASE__); if(! ($this->_link)){ echo 'Something wrong occurs on the database connection!'; } } // 防止单例类被克隆 private function __clone(){} // 外界访问单例类实例的接口 public static function getInstance(){ if(! (self::$_instance instanceof self)){ self::$_instance = new self(); } return self::$_instance; } }
注意,以上定义的一个 __clone() 函数,防止单例类对象被克隆。
以下也是一个简单的数据库操作类的单例,供参考:
class DB { /** * the database connection * @var resource * @access private */ private $_link; /** * the static instance of single db * @var object * @access static */ static $_instance; /** * construct the single object * @return null * @access private */ private function __construct(){ $this->_link = @mysqli_connect(__HOST__, __USER__, __PASSWORD__, __DATABASE__); if(! ($this->_link)){ echo 'Something wrong occurs on the database connection!'; } } /** * empty clone * @return null * @access private */ private function __clone(){} /** * for other object to get the instance of db * @return self::instance * @access public */ public static function getInstance(){ if(! (self::$_instance instanceof self)){ self::$_instance = new self(); } return self::$_instance; } /** * query * @param sql string * @param message string * @return resource * @access public */ public function query($sql,$message){ $result = @mysqli_query($this->$_link, $sql) or die($message . mysqli_error($this->$_link)); return $result; } /** * mysqli_num_rows * @param result resource * @return int * @access public */ public function num($result){ return @mysqli_num_rows($result); } /** * mysqli_fetch_array * @param result resource * @return array * @access public */ public function fetchArr($result){ return @mysqli_fetch_array($result); } /** * mysqli_insert_id * @return int * @access public */ public function last_id(){ return @mysqli_insert_id($this->_link); } /** * close the database connection * @param result resource * @return null * @access public */ public function close(){ @mysqli_close($this->_link); } /** * fetch once result from the specific sql query * @param sql string * @param message string * @return array * @access public */ public function fetchArrOnce($sql, $message){ $result = $this->query($sql, $message); $row = $this->fetchArr($result); return $row; } /** * fetch all results from the specific sql query * @param sql string * @param message string * @return array * @access public */ public function fetchArrMore($sql, $message){ $result = $this->query($sql, $message); $moreRow = array(); while($row = $this->fetchArr($result)){ $moreRow[] = $row; } return $moreRow; } /** * fetch the number of results from the specific sql query * @param sql string * @param message string * @return array * @access public */ public function fetchNum($sql, $message){ $result = $this->query($sql, $message); $resultNum = $this->num($result); return $resultNum; } /** * mysqli_prepare * @param sql string * @return stmt object * @access public */ public function prepare($sql){ return @mysqli_prepare($this->_link, $sql); } /** * mysqli_stmt_execute * @param stmt object * @param message string * @return bool * @access public */ public function stmt_execute($stmt, $message){ @mysqli_stmt_execute($stmt) or die($message . mysqli_error($this->_link)); } }
使用:
define("__HOST__", "localhost"); define("__USER__", "root"); define("__PASSWORD__", ""); define("__DATABASE__", "eee"); $db = DB::getInstance();
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
本文向大家介绍PHP中单例模式与工厂模式详解,包括了PHP中单例模式与工厂模式详解的使用技巧和注意事项,需要的朋友参考一下 单例模式概念 单例模式是指整个应用中类只有一个对象实例的设计模式。 单例模式的特点 一个类在整个应用中只有一个实例 类必须自行创建这个实例 必须自行向整个系统提供这个实例 php中使用单例模式的原因 我用php大部分操作都是和各种数据库打交道,包括mysql,redis,me
本文向大家介绍PHP设计模式之单例模式定义与用法分析,包括了PHP设计模式之单例模式定义与用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了PHP设计模式之单例模式。分享给大家供大家参考,具体如下: 单例模式(Singleton Pattern 单件模式或单元素模式),是常见的一种设计模式,它有三个特点 1.只能有一个实例 2.必须自行创建这个实例 3.必须给其他对象提供这一实例 下
本文向大家介绍php单态设计模式(单例模式)实例,包括了php单态设计模式(单例模式)实例的使用技巧和注意事项,需要的朋友参考一下 单态设计模式也叫单例模式: 1.单态设计模式含义: 单态模式的主要作用是保证在面向对象编程设计中,一个类只能有一个实例对象存在。作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存
本文向大家介绍java 单例模式的实例详解,包括了java 单例模式的实例详解的使用技巧和注意事项,需要的朋友参考一下 java 单例模式的实例详解 概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。 单例模式有一下特点: 1、单例类只能有一个实例。 2、单例类必须自己自己创建自己的唯一实例。 3、单例类必须给所有其他对
本文向大家介绍PHP策略模式定义与用法示例,包括了PHP策略模式定义与用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP策略模式定义与用法。分享给大家供大家参考,具体如下: 概述 策略模式属于对象的行为模式。其用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化 UML图 策略模式中主要角色
本文向大家介绍PHP设计模式之委托模式定义与用法简单示例,包括了PHP设计模式之委托模式定义与用法简单示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP设计模式之委托模式定义与用法。分享给大家供大家参考,具体如下: 委托模式: 通过分配或委托至其他对象,委托设计模式能够去除核心对象中的判决和复杂的功能性。 运行结果: 4000 2000 传统方式: 在传统方式下,我们需要判断当前操