单例模式
单例模式是所有语言中最合适php的模式 ,也是学习过程中最常用的模式 例如 数据库连接类
设计模式的目的是用来防止 重复初始化或者new ,占用内存空间,达到优化目的的一种设计模式
2.三个要素
1.保存一个唯一的一个静态成员属性
2.__construct 和 __clone 两个魔术方法需要声明私有的 private 防止外部克隆和重复创建
3. 需要保存一个返回唯一实例的静态方法 提供外部调用返回 唯一实例
模式结构
<?php class Demo { //设置唯一实例并设置为空, private static $obj = null; //私有化构造方法 private function __construct() { } //私有化克隆方法 private function __clone() { } //返回唯一实例的静态方法 public static function getInstence() { if (self::$obj == null){ self::$obj = new self; } return self::$obj; } } $exp1 = new Demo(); $obj1 = $exp1::getInstence(); $exp2 = new Demo(); $obj2 = $exp2::getInstence(); var_dump($exp1==$exp2); echo "<hr>"; var_dump($obj1==$obj2); ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
数据库连接实例
<?php class Db { //数据库连接类 //设置唯一实例并设置为空,保存唯一的一个返回全局实例 private static $obj = null; //数据库连接句柄 private $con; //类常量 const HOSTNAME = '127.0.0.1'; const USERNAME = 'root'; const PASSWORD = 'root'; const DBNAME = 'video'; //私有化构造方法 private function __construct() { //初始化连接 $this->con = mysqli_connect(self::HOSTNAME,self::USERNAME,self::PASSWORD,self::DBNAME); } //私有化克隆方法 private function __clone() { } //返回唯一实例的静态方法 public static function getInstence() { if (self::$obj == null){ self::$obj = new self; } return self::$obj; } public function getInfo() { $sql = "SELECT * FROM member WHERE id >2"; $res = mysqli_query($this->con,$sql); $userinfo = []; foreach (mysqli_fetch_all($res) as $k =>$v){ $userinfo[$k] = $v; } return $userinfo; } } echo "<pre>"; $obj = Db::getInstence(); $obj2 = Db::getInstence(); var_dump($obj==$obj2); echo "<hr>"; print_r($obj->getInfo());
运行实例 »
点击 "运行实例" 按钮查看在线实例