龙空技术网

php设计模式1——单例模式

青山三毫米 155

前言:

今天朋友们对“php写一个单例模式”都比较讲究,我们都想要学习一些“php写一个单例模式”的相关内容。那么小编同时在网上网罗了一些关于“php写一个单例模式””的相关文章,希望我们能喜欢,看官们快快来了解一下吧!

单例模式是什么?

一个类每new一次就会创建一个新的实例,而单例模式则是每次获取的都是同一个实例,在整个项目生命周期中通过单例创建的同一个类的实例都有且只有一个。

为什么要使用单例模式?

一些特殊的场景中我们需要每次都使用同一个实例,创建多个实例会造成额外的开支,浪费性能。比如:mysql连接,redis连接等。

单例模式的使用方法:结构:

4私一公

私有化构造方法: 防止使用 new 创建多个实例;私有化克隆方法: 防止 clone 多个实例;私有化重建方法: 防止反序列化私有化静态属性: 防止直接访问存储实例的属性公有化静态创建实例方法:唯一获取实例的方法示例:

没有使用单例的class

<?phpclass General{    public static $instance = null;    public static function getInstance(){        if(null === static::$instance){            static::$instance = new static();        }        return static::$instance;    }    public function __construct(){}    public function __clone(){}    public function __wakeup(){}}$general1 = new General();$general2 = clone $general1;$general3 = General::getInstance();$general4 = unserialize(serialize($general3));$general5 = $general3::$instance;var_dump($general1);echo PHP_EOL;var_dump($general2);echo PHP_EOL;var_dump($general3);echo PHP_EOL;var_dump($general4);echo PHP_EOL;var_dump($general5);echo PHP_EOL;//打印结果:object(General)#1 (0) {}object(General)#2 (0) {}object(General)#3 (0) {}object(General)#4 (0) {}object(General)#3 (0) {}

使用了单例的class

<?php//4私一公//4私//1. 私有化构造方法: 防止使用 new 创建多个实例;//2. 私有化克隆方法: 防止 clone 多个实例;//3. 私有化重建方法: 防止反序列化//4. 私有化静态属性: 防止直接访问存储实例的属性//1公//公有化静态获取实例方法:获取单例class Singleton{    private static $instance = null;    public static function getInstance(){        if(null === static::$instance){            static::$instance = new static();        }        return static::$instance;    }    private function __construct(){}    private function __clone(){}    private function __wakeup(){}}//$singleton1 = new Singleton();//报错//$singleton2 = clone $singleton1;//报错$singleton3 = Singleton::getInstance();$singleton6 = Singleton::getInstance();//$singleton4 = unserialize(serialize($singleton3));//警告//$singleton5 = $singleton3::$instance;//报错//var_dump($singleton1);echo PHP_EOL;//var_dump($singleton2);echo PHP_EOL;var_dump($singleton3);echo PHP_EOL;//var_dump($singleton4);echo PHP_EOL;//var_dump($singleton5);echo PHP_EOL;var_dump($singleton6);echo PHP_EOL;//打印:object(Singleton)#1 (0) {}object(Singleton)#1 (0) {}

可以看到,没有使用单例的class可以通过各种途径创建出新的实例,而使用了单例的class都会报错或警告,只有通过制定的方法获取实例,每次都是获取的同一个

标签: #php写一个单例模式