单例模式
单例模式是所有语言中最合适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());点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号