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

    今天在学习php面向对象时,看到一个面向对象的面试题

    题目是这样的:

    +++++++面试题++++++++++

    请用单例设计模式方法设计类满足如下需求:

    请用 PHP5 代码编写类实现在每次对数据库连接的访问中都只能获得唯一的一个数据库连接,具体连接数据库的详细代码忽略,请写出主要逻辑代码

    +++++++++++++++++++

    单例模式有几个要点:

    1.类的构造函数必须标记为 private(私有) (访问控制:防止外部代码通地new 操作符创建对象) 来能在其它类中实例化,只能在类自身中进行实例化。

          private fcuntion __construc()

    2.拥用一个保存类实例的 私有静态成员变量

      private static $ins ;  //$ins 用来保存这个类的实例

    3.拥有一个访问这个类实例的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化) 

    4.创建 私有的__clone 方法 ,防止对象被复制。

     为什么这么做呢?

    1、php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。

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

    3、在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。

    最终答案代码如下

    <?php
        class Mysql
        {
            private static $instance = null;
            private $conn;
    
            // 构造方法,设置为private,不允许通过new获得对象实例
            private function __construct(argument)
            {
                $conn = mysql_connect("localhost","root","root");
            }
    
            // 获取实例方法
            public static function getInstance()
            {
                if (!self::$instance instanceof self) {
                    self::$instance = new self;
                }
                return self::$instance;
            }
    
            // 禁止克隆
            private function __clone(){}
        }
    
        // 获得对象
        $db = Mysql::getInstance();
    ?>
     

    再此做一下备忘录。

    <?phpclass Mysql { privatestatic $instance = null; private $conn; // 构造方法,设置为private,不允许通过new获得对象实例privatefunction __construct(argument) { $conn = mysql_connect("localhost","root","root"); } // 获取实例方法publicfunction getInstance() { if (!self::$instance instanceofself) { self::$instance = newself; } returnself::$instance; } // 禁止克隆privatefunction __clone(){} } // 获得对象 $db = Mysql::getInstance(); ?>

  • 相关阅读:
    webpack前端构建工具学习总结(一)之webpack安装、创建项目
    NPM、nodeJS安装,grunt自动化构建工具学习总结
    javascript获取childNodes详情,删除空节点
    苹果手机微信上form表单提交的问题
    苹果safari浏览器window.open问题
    微信公众号右上角菜单
    js实现阶乘
    my97DatePicker日期控件——日期输入框联动,使用focus使第二个输入框没展示出日期控件
    事件绑定和普通事件的区别
    Java单例模式的例子
  • 原文地址:https://www.cnblogs.com/ycookie/p/6728138.html
Copyright © 2011-2022 走看看