搜索

查看: 3197|回复: 11

[PHP] 一文带你搞懂PHP单例模式

[复制链接]
发表于 2023-5-4 17:06:12 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:06:12 3197 11 看全部
目录
  • 简介
  • 场景
  • 优点
  • 缺点
  • 示例代码
    简介
    单例模式是创建型对象的一种,用于如何优雅的创建对象。
    让一个类最多产生一个对象。

    场景
    只需要一个对象就能解决并且要使用多次的场景,比如框架的数据库连接。

    优点
    减少资源消耗,一个对象能完成的事情,就不需要再实例化出来同样的东西。

    缺点
    对象生命周期都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式意义不大。

    示例代码
    class Demo {
        //声明一个存储对象的方法
        private static $obj;
        //防止当前类的外部进行实例化
        private function __construct() {}
        //防止当前类的外部进行克隆
        private function __clone() {}
        //声明一获取示例的方案
        public static function getInstance() {
            if(self::$obj === null) {
                self::$obj = new self();
            }
            return self::$obj;
        }
        public function otherFunction() {
            //todo ...
        }
    }
    测试代码:
    class Demo {
        //声明一个存储对象的方法
        private static $obj;
        //防止当前类的外部进行实例化
        private function __construct() {}
        //防止当前类的外部进行克隆
        private function __clone() {}
        //声明一获取示例的方案
        public static function getInstance() {
            if(self::$obj === null) {
            //在此处打印数据到文件,可清楚的看出来执行了几次。
            //静态方法或者静态属性可以称之为类变量或者类属性,会随着类的加载一并加载到内存当中。
                file_put_contents('F:/stdout.txt', 1,FILE_APPEND);
                self::$obj = new self();
            }
            return self::$obj;
        }
        public function otherFunction() {
            //todo ...
        }
    }
    //类的外部执行了5次实例化操作
    for($i = 0; $i
    升级版本:
    如果每一个类都写一个单例模式的话,会显得有重复的代码,为此可以用继承去解决这个问题。
    此时self就需要修改为static,不然self是当前对象而不是子类对象。
    static::方法或属性,这种使用称为后期静态绑定。
    这和但是static 修饰成员属性或者成员方法,一个是使用,一个是修饰。
    class Singleton {
        //声明一个存储对象的方法
        private static $obj;
        //防止当前类的外部进行实例化
        private function __construct() {}
        //防止当前类的外部进行克隆
        private function __clone() {}
        //声明一获取示例的方案
        public static function getInstance() {
                //检测$obj是否为空并是否不属于当前类
            if(((static::$obj === null) && (! static::$obj instanceof static))) {
                static::$obj = new static();
            }
            return static::$obj;
        }
    }
    class Test extends Singleton {
        public function func() {
            return mt_rand(0, 10);
        }
    }
    //使用:
    Test::getInstance()->func();
    到此这篇关于一文带你搞懂PHP单例模式的文章就介绍到这了,更多相关PHP单例模式内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛!
  • 发表于 2023-6-28 20:52:34 | 显示全部楼层
    六翼天使494 2023-6-28 20:52:34 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    发表于 2023-6-28 22:11:04 | 显示全部楼层
    当当当当裤裆坦 2023-6-28 22:11:04 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    发表于 2023-6-29 20:14:09 | 显示全部楼层
    哈哈SE7 2023-6-29 20:14:09 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    发表于 2023-6-29 21:40:47 | 显示全部楼层
    执着等待等wc 2023-6-29 21:40:47 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    发表于 2023-6-29 22:53:11 | 显示全部楼层
    向往草原403 2023-6-29 22:53:11 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    发表于 2023-6-30 01:06:42 | 显示全部楼层
    惜颜705 2023-6-30 01:06:42 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    发表于 2023-6-30 10:51:18 | 显示全部楼层
    老橡树1 2023-6-30 10:51:18 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    发表于 2023-6-30 13:38:15 | 显示全部楼层
    123456848 2023-6-30 13:38:15 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    发表于 2023-7-1 01:40:49 | 显示全部楼层
    十二音阶囤 2023-7-1 01:40:49 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    • 您可能感兴趣
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| 小黑屋| 知鸟论坛 |网站地图
    本站资源来自互联网用户收集发布,如有侵权请邮件联系处理。 联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表