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) { //}