1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/** * 单例模式 只产生一个实例化对象 */ class human{ // 定义静态属性 保存生产的对象 private static $object = NULL; // 构造方法私有化 禁止外部实例化对象 private function __construct(){ echo __METHOD__ . "<br>"; } /** * 定义一个静态方法 通过类内部返回实例化对象 * @return object */ public static function get_instance(){ // 判断保存的object静态属性对象是否是当前对象 if(!(self::$object instanceof self)){ // 如果不是 就实例化当前对象并保存到object静态属性 self::$object = new self(); } // 返回对象 return self::$object; } } // 通过静态成员方法访问 $h1 = human::get_instance(); $h2 = human::get_instance(); $h3 = human::get_instance(); var_dump($h1,$h2,$h3); |
返回结果:(只new了一次)
1 2 3 4 5 6 |
human::__construct object(human)#1 (0) { } object(human)#1 (0) { } object(human)#1 (0) { } |
为什么使用单例模式使用单例模式的好处很大,以数据库操作为例。若不采用单例模式,当程序中出现大量数据库操作时,每次都要执行new操作,每次都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都是对数据库的一种极大考验和浪费。使用了单例模式,只需要实例化一次,不需要每次都执行new操作,极大降低了资源的耗费。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php /** * 单例模式 **/ class Db { //保存全局实例 private static $instance; //数据库连接句柄 private $db; //数据库连接参数 const HOSTNAME = "127.0.0.1"; const USERNAME = "root"; const PASSWORD = "root"; const DBNAME = "testdb"; //私有化构造函数,防止外界实例化对象 private function __construct() { $this->db = mysqli_connect(self::HOSTNAME,self::USERNAME, self::PASSWORD,self::DBNAME); } //私有化克隆函数,防止外界克隆对象 private function __clone() { } //单例访问统一入口 public static function getInstance() { if(!(self::$instance instanceof self)) { self::$instance = new self(); } return self::$instance; } //数据库查询操作 public function getinfo() { $sql = "select * from testtb"; $res = mysqli_query($this->db,$sql); while($row = mysqli_fetch_array($res)) { echo $row['testcol'] . '<br />'; } mysqli_free_result($res); } } $mysqli = Db::getInstance(); $mysqli->getinfo(); ?> |