PHP 单例模式的使用场景探索

php 单例的使用场景

php 单例模式的使用场景探索,什么时候使用单例,单例在什么时候才会被用到呢,本文进行解剖。

php 单例创建要素

  1. 需要一个保存类的唯一实例的静态成员变量。
  2. 构造函数和克隆函数必须声明为私有的,防止外部程序创建或复制实例副本。
  3. 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用。

单例的目的

保证一个类只有一个实例,并提供一个访问它的全局访问点,就是说不管你多少次调用,他只会 new 一次

使用场景

如果这个类频繁的被调用,那么你就可以使用单例模式

例子测试演示

<?php

$stime=microtime(true); //获取程序1,开始的时间

class a{
    public function getName(){
        echo '我是A的名称<br/>';
        $b=new b();
        $b->getName();
        $c=new c();
        $c->getName('A');
    }

}
class b{
    public function getName(){
        echo '我是B的名称<br/>';
      $c=new c();
        $c->getName('B');
    }
}
class c{
    public function getName($name){
        echo '我是传递的'.$name.'的调用C的名称<br/>';
    }
}

$a=new a();
$a->getName();

这里可以看到,我们2次 new c

如果我们使用单例的话,则不会2次 new
将C改造成

class a{
    public function getName(){
        echo '我是A的名称<br/>';
        $b=new b();
        $b->getName();
        $c=C::getInstance();
        $c->getName('A');
    }

}
class b{
    public function getName(){
        echo '我是B的名称<br/>';
        $c=C::getInstance();
        $c->getName('B');
    }
}
class c{
     //创建静态私有的变量保存该类对象
    static private $instance;

    //防止使用new直接创建对象
    private function __construct()
    {
    }

    //防止使用clone克隆对象
    private function __clone()
    {
    }

    static public function getInstance()
    {
        //判断$instance是否是Singleton的对象,不是则创建
        if (!self::$instance instanceof self) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    public function getName($name){
        echo '我是传递的'.$name.'的调用C的名称<br/>';
    }
}

除了使用单例之外,我们还有其他的使用方案吗?

我们在看开源系统框架的时候,他们经常会把已经加装过的对象保存在一个静态的数组里面,那样他们调用的时候,会从数组里面找,这种也是替代单例的一种形式

<?php

$stime=microtime(true); //获取程序1,开始的时间

class a{
    public function getName(){
        echo '我是A的名称<br/>';
        $b=new b();
        $b->getName();
        $c=getClass::getInstance('c');
        $c->getName('A');
    }

}
class b{
    public function getName(){
        echo '我是B的名称<br/>';
       $c=getClass::getInstance('c');
        $c->getName('B');
    }
}
class c{
    public function getName($name){
        echo '我是传递的'.$name.'的调用C的名称<br/>';
    }
}
class getClass
{
    public static $object = [];
    static public function getInstance($class)
    {

        if (!isset(self::$object[$class]) || !self::$object[$class] instanceof $class) {
            self::$object[$class] = new $class();
        }
        return self::$object[$class];
    }
}

$a=new a();
$a->getName();

这样也是保证我们的程序只实例一次类。


提示

评论区 (0)

没有记录
支持 markdown,图片截图粘贴拖拽都可以自动上传。
黑白课堂

黑白课堂

混元大罗金仙 站长创业者玉树凌风每天醒来0收入

查看更多

最新视频课程

Laravel 的 PhpSpreadsheet 包入门

wap2App 入门讲解,100%速成,全面为你讲解。

ace.js 打造一款属于你的 Web 编辑器,入门文档。

Laravel Permission 中文文档

解释 OAuth 2.0 认证 和使用场景说明

Laravel 之 horizon 队列管理界面系统

钻级赞助商