zoukankan      html  css  js  c++  java
  • PHP之单例模式

    之前记得有写过PHP的几种这模式。这几天看群里在问单列模式,觉得还是有必要再深入写清楚下。。其实单例模式很好理解滴哦

    单例模式顾名思义,就是只有一个实例,作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

    单例模式的三个要点:

      1.某个类只能有一个实例。

      2.必须自行创建这个实例。

      3.必须自行向整个系统提供这个实例。

    为什么要使用PHP单例模式?

      1.PHP的应用有一个大方面是针对于数据库,一个应用中会存在大量的数据库操作,在使用面向对象的方式开发时,如果使用单例模式,就可以避免大量的new 操作消耗的资源,还可以减少数据库连接,这样就不容易出现too many connections情况。

      2.如果一个系统中需要一个类来全局控制某些配置信息,那么,使用单例模式可以很方便的实现。

      3.在一次页面请求中便于进行调试,因为所有代码都集中在一个类中,可以在类中设置钩子,输出日志,避免到处的var_dump(),echo。

    这个实例足以深入理解单利模式的妙用:

    <?php
    
    /**
     * 设计模式之单例模式
     * $_instance必须声明为静态的私有变量
     * 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
     * getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
     * ::操作符只能访问静态变量和静态函数
     * new对象都会消耗内存
     * 使用场景:最常用的地方是数据库连接。
     * 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
     */
    class Girlfriend
    {
        //保存例实例在此属性中
        private static $_instance;
    
        //构造函数声明为private,防止直接创建对象
        private function __construct()
        {
            echo '实例初始化了!';
        }
    
        //单例方法
        public static function get_instance()
        {
            var_dump(isset(self::$_instance));
    
            if(!isset(self::$_instance))
            {
                self::$_instance=new self();
            }
            return self::$_instance;
        }
    
        //阻止用户复制对象实例
        private function __clone()
        {
            trigger_error('禁止克隆' ,E_USER_ERROR);
        }
    
        function test()
        {
            echo("here is a test");
        }
    }
    
    // 这个写法会出错,因为构造方法被声明为private
    //$test = new Girlfriend;
    
    // 下面将得到该类的单例对象
    $test = Girlfriend::get_instance();
    $test = Girlfriend::get_instance();
    $test->test();
    
    // 复制对象将导致一个E_USER_ERROR.
    //$test_clone = clone $test;

    上面两次调用:Girlfriend::get_instance() 而构造函数只是在初始实例时调用一次,并且初始的var_dump(isset(self::$_instance)) 返回false,后面多次实例都未输出构造函数...var_dump(isset(self::$_instance)) 都返回了true。。。
    名副其实的一个类只有一个实例...相信这个例子大家应该可以深入理解啦.

    
    
  • 相关阅读:
    Python中的类(上)
    Django REST Framework API Guide 07
    Django REST Framework API Guide 06
    Django REST Framework API Guide 05
    Django REST Framework API Guide 04
    Django REST Framework API Guide 03
    Django REST Framework API Guide 02
    Django REST Framework API Guide 01
    Django 详解 信号Signal
    Django 详解 中间件Middleware
  • 原文地址:https://www.cnblogs.com/phpper/p/7634980.html
Copyright © 2011-2022 走看看