单例模式 singleton
php的单例,仅指进程中单例,不似java,在整个内存中单例
所谓单例模式,即在应用程序中最多只有该类的一个实例存在,一旦创建,就会一直存在于内存中!
应用场景:
单例设计模式常应用于数据库类设计,采用单例模式,只连接一次数据库,防止打开多个数据库连接。
如何确保只制造一个对象
1:对象的产生,需要new或者clone
2:防止产生过多的对象,要防止new和clone/继承
3:综上,没有对象时,允许new,并把对象缓存.下次直接返回该对象
<?php
final class sigle
{
/**
* @var null
*/
protected static $ins =null;
private function __construct()
{
}
private function __clone()
{
}
/**
* CreateDTime: 2021/6/16 14:35
* Function: ""
* @return sigle|null
*/
public static function getIns()
{
if (self::$ins==null){
self::$ins=new self();
}
return self::$ins;
}
}
$s1= sigle::getIns();
$s2= sigle::getIns();
if ($s1 === $s2){
echo '是一个对象';
}else{
echo '不是一个对象';
}
/*
new sigle();
class a extends sigle
{
}*/
没错,核心就是这样一个单例类,没别的了。让静态变量保存实例化后的自己。当需要这个对象的时候,调用getIns()方法获得全局唯一的一个对象。
实例
既然上面说过数据库操作类和网络请求类都很喜欢用单例模式,那么我们就来实现一个Http请求类的单例模式的开发。
<?php
class HttpService{
private static $instance;
public function GetInstance(){
if(self::$instance == NULL){
self::$instance = new HttpService();
}
return self::$instance;
}
public function Post(){
echo '发送Post请求', PHP_EOL;
}
public function Get(){
echo '发送Get请求', PHP_EOL;
}
}
$httpA = new HttpService();
$httpA->Post();
$httpA->Get();
$httpB = new HttpService();
$httpB->Post();
$httpB->Get();
var_dump($httpA == $httpB);