PHP单例模式

单例模式 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);


了解什么是特征以及如何使用它们的最好方法是观察它们的本质