简单了解什么是PHP单例模式?
- A
1.什么是单例模式?我们为什么要用单例模式?
单例模式最常用在需要只使用这一个类,而不是会有多个类(数据库操作);作为对象的创建模式,单例模式确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口,它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
打个比方。比如现在有个config类,这个类主要是存储这个项目的配置信息。如果说这个类能实例化多次的话,那么如果在代码运行中对配置进行了修改,那么你如何知道是在哪个配置类中进行了修改了呢?如果这个时候使用单例模式的话,就避免了情况的发生,所有对于配置文件的改变都是基于这个类的实例进行修改的,从而不会出现因为多个类的实例化,对于操作的改变没有进行实时的更新。而且,实例多个类库,占用内存也会非常的厉害,这样只实例化一次。是不是好处多多呢?
2.PHP单例模式三要素
需要一个保存类的唯一实例的静态成员变量。 构造函数和克隆函数必须声明为私有的,防止外部程序创建或复制实例副本。 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用。
3.用六部分剖析单例模式:
<?php
/*
单例设计模式 (单态)
定义: 一个类 只能允许有 一个对象存在.
1.不让进: 使类不能被实例化
2.禁克隆: 使类不能被克隆
3.留后门: 设置静态方法
4.给对象: 在静态方法里实例化该类
5.判初夜: 判断是否是 第一次产生该类的对象
6.设静态: 静态方法里 要使用静态属性
*/
/*//1.不让进: 使类不能被实例化-----------------
class Test
{
// 构造器私有化:禁止从类外部实例化
private function __construct()
{
//占位, 我就是不让你NEW我~~~
}
}*/
/*//2.禁克隆: 使类不能被克隆--------------------
class Test
{
// 构造器私有化:禁止从类外部实例化
private function __construct()
{
//占位, 我就是不让你NEW我~~~
}
// 克隆方法私有化:禁止从外部克隆对象
private function __clone()
{
//占位, 谁也别想COPY我~~~
}
}*/
/*//3.留后门: 设置静态方法--------------------
class Test
{
// 构造器私有化:禁止从类外部实例化
private function __construct()
{
//占位, 我就是不让你NEW我~~~
}
// 克隆方法私有化:禁止从外部克隆对象
private function __clone()
{
//占位, 谁也别想COPY我~~~
}
//后门
public static function getObject()
{
echo "啊,我是后门,进吧!<br>";
}
}*/
/*//4.给对象: 在静态方法里实例化该类------------------
class Test
{
// 构造器私有化:禁止从类外部实例化
private function __construct()
{
//占位, 我就是不让你NEW我~~~
}
// 克隆方法私有化:禁止从外部克隆对象
private function __clone()
{
//占位, 谁也别想COPY我~~~
}
//后门
public static function getObject()
{
echo "啊,我是后门,进吧!<br>";
return new self();//实例化一个对象给你
}
}*/
/*//5.判初夜: 判断是否是 第一次产生该类的对象------------------
class Test
{
private static $obj = null;//属性值为对象,默认为null
// 构造器私有化:禁止从类外部实例化
private function __construct()
{
//占位, 我就是不让你NEW我~~~
}
// 克隆方法私有化:禁止从外部克隆对象
private function __clone()
{
//占位, 谁也别想COPY我~~~
}
//后门
public static function getObject()
{
echo "啊,我是后门,进吧!<br>";
if ($this->obj === null) {
$this->obj = new self();//实例化一个对象
}
//返回的属性 其实就是本对象
return $this->obj;
}
}*/
//6.设静态: 静态方法里 要使用静态属性------------------
class Test
{
private static $obj = null;//属性值为对象,默认为null
// 构造器私有化:禁止从类外部实例化
private function __construct()
{
//占位, 我就是不让你NEW我~~~
}
// 克隆方法私有化:禁止从外部克隆对象
private function __clone()
{
//占位, 谁也别想COPY我~~~
}
//后门
public static function getObject()
{
echo "啊,我是后门,进吧!<br>";
if (isset(self::$obj)) {
self::$obj = new self();//实例化一个对象
}
//返回的属性 其实就是本对象
return self::$obj;
}
}
// 使用静态方法访问该类里的方法
$t1 = Test::getObject();
$t2 = Test::getObject();
$t3 = Test::getObject();
$t4 = Test::getObject();
//判断 两个对象 是否是同一个对象
if ($t1 === $t3) {
exit('是本尊没错了!');
} else {
exit('不是本人...');
}
PS:本文案例基于知乎大佬 @独身待苍颜 优化改进
版权声明:若无特殊注明,本文为《傲世》原创,转载请保留文章出处。
本文链接:https://www.recho.cn/182.html
如您对本文章内容有所疑问、反馈或补充,欢迎通过邮箱:admin@h2fast.cn 联系我们!
正文到此结束





