单例模式

常规类

/*
 * 常规类一但被实例就会创建一个新的对象一级新的资源ID和内存空间作为保存。
 * 常规类的实例出来对象都不相等的
**/
class Obj{
	public $str = null;
	public function __construct(){
		$this->str = mt_rand(111,999);
	}
}

$s1 = new Obj();
$s2 = new Obj();
$s3 = new Obj();
print_r($s1);
print_r($s2);
print_r($s3);

结果:
Obj Object ( [str] => 931 ) Obj Object ( [str] => 978 ) Obj Object ( [str] => 779 )

单例模式

单例模式:一个类只有一个实例。而且是内部自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本。而是返回单例类内部存储的实例一个引用。

<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2019/12/25
 * Time: 15:04
 */

/**
 * 如何写一个属于自己的单例类?
 * 写一个单例类的规则:
 * 1.有一个静态成员变量来保存类的唯一实例
 * 2.构造函数和克隆函数都是私有的
 * 3.公共的静态方法可以访问类的实例作为一个引用返回
 * 4.只能实例化一次
 */

class Obj
{
    protected static $_Ins;
    public $str = null;
    private function __construct(){
    	$this->str = mt_rand(111,999);
    }
    private function __clone()
    {
        
    }
    public static function getInstance(){
        if (!(self::$_Ins instanceof self)){
            self::$_Ins = new self();
        }
        return self::$_Ins;
    }
}

$s1 = Obj::getInstance();
$s2 = Obj::getInstance();

print_r($s1);
print_r($s2);

结果:
Obj Object ( [str] => 598 ) Obj Object ( [str] => 598 )

注释
instanceof作用:(1)判断一个对象是否是某个类的实例,(2)判断一个对象是否实现了某个接口。

单例模式的使用场景和优缺点

  • 优点:一个类不管多少次实例化,永远只会执行一次操作。其实实例化操作都只是返回了一个对象应用。也就是说我们在没有使用单例模式,一个对象被创建时同时也会分配一个资源ID和一个内存空间。
  • 场景:
    1.Session类
    2.购物车
    3.项目配置类
    4.数据库
    5.读取文件类

PHP单例模式的缺点
PHP动态脚本语言,也是解析型语言。那么PHP的这种运行机制,使得PHP页面被解析过后会回收所有相关的资源。也就是说呢?PHP是不支持变量或者对象在内存中以常驻的方式存在的。所以PHP,所有的变量无论是全局变量还是类的静态成员都是页面级的。每一次页面的刷新都会创建新的对象,而解析完之后就回收。这样一来,PHP的单例就没有多大的意义了。但我们在实际项目当中,用户所请求的页面会用多个应用场景共享一个资源。那么此时单例就很有意义了。当然我们也可以把单例对象放入到缓存中,做到强类型语言一样的全局使用。

发布了12 篇原创文章 · 获赞 1 · 访问量 7129
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章