常规类
/*
* 常规类一但被实例就会创建一个新的对象一级新的资源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的单例就没有多大的意义了。但我们在实际项目当中,用户所请求的页面会用多个应用场景共享一个资源。那么此时单例就很有意义了。当然我们也可以把单例对象放入到缓存中,做到强类型语言一样的全局使用。