php设计模式-单例模式

1) 什么是单例模式

2)为什么使用单例模式

3)单例模式的使用方法

 

单例模式介绍与说明:

  什么是:只会生产一个实例对象的类,就叫做单例模式。单例模式生成一个对象后, 该对象可以被其它众多对象所使用。

  为什么:在开发过程中,往往有其他同事在不知情的情况下很容易就轻而易举的 new 一个对象出来,如果这样的情况很多,会很大程度上引起内存资源浪费。

  举栗子:像数据库连接的调用以及常用的基类都可以使用单例模式来实现。

  如何做:实现一个实例类将它存在一个静态私有变量中,在处理这个类不会被克隆、不会被反序列化就可以真正意义上实现单例模式。

 

代码案例:普通类的调用

  

<?php

/**
 * 普通类的调用
 * Class Login
 */
class Login
{
    protected static $name;

    public function __construct( $userName )
    {
        self::$name = $userName;
    }

    public function init()
    {
        echo self::$name;
    }
}

$obj  = new Login(111);
$obj1 = clone $obj;
$obj2 = unserialize(serialize($obj));

var_dump($obj);
var_dump($obj1);
var_dump($obj2);

# 由输出可以见每一个对象都不一样

//object(Login)#1 (0) {
//}
//object(Login)#2 (0) {
//}
//object(Login)#3 (0) {
//}

 

单例模式的使用

<?php

class BaseLogin 
{
    private static $name;
    private static $instance;

    /**
     * 防止new 多个实例
     * BaseLogin constructor.
     * @param $name
     */
    private function __construct($name)
    {
        self::$name = $name;
    }

    /**
     * 单例类的出口
     * @return mixed
     */
    public static function getInstance()
    {
        $args = func_get_args();

        if ( !self::$instance instanceof self ) {
            self::$instance = new self( ...$args );
        }

        return self::$instance;
    }

    public function index()
    {
        echo self::$name;
    }

    /**
     * 以防被克隆
     */
    private function __clone()
    {
    }

    /**
     * 防止返序列化
     */
    private function __wakeup()
    {
    }

}

# 这里实例化对象会报错,不给实例了,所以只能走单一入口
# $obj = new BaseLogin();
# var_dump($obj);
# Fatal error: Uncaught Error: Call to private BaseLogin::__construct()

$result = BaseLogin::getInstance("你好")->index();

var_dump($result); # 你好

$login1 = BaseLogin::getInstance("111");
$login2 = BaseLogin::getInstance("222");
var_dump($login1);
var_dump($login2);

# 由下可见是同一个类
//你好NULL
//object(BaseLogin)#1 (0) {
//}
//object(BaseLogin)#1 (0) {
//}
posted @ 2020-03-10 00:13  清零者  阅读(195)  评论(0编辑  收藏  举报