简单了解什么是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
如您对本文章内容有所疑问、反馈或补充,欢迎通过邮箱:[email protected] 联系我们!
版权声明:若无特殊注明,本文为《正文到此结束