• 简单的注册者模式取代global的全局变量


    注册模式
    让一些对象能够被我们代码中所有的组件使用到(译者注:全局化对象或者数据)的最好的方法就是使用一个中央容器对象,用它来包含我们所有的对象。通常这种容器对象被人们称为一个注册器。它非常的灵活而且也非常的简单。一个简单的注册器对象就如下所示:
    复制代码 代码如下:

    <?php
    Class Registry {
        var $_objects = array();
        function set($name, &$object) {
            $this->_objects[$name] =& $object;
        }
        function &get($name) {
            return $this->_objects[$name];
        }
    }
    ?>

    使用注册器对象的第一步就是使用方法set()来注册一个对象:
    复制代码 代码如下:

    <?php
    $db = new DBConnection;
    $settings = new Settings_XML;
    $user = new User;
    // Register objects
    $registry =& new Registry;
    $registry->set ('db', $db);
    $registry->set ('settings', $settings);
    $registry->set ('user', $user);
    ?>

    现在我们的寄存器对象容纳了我们所有的对象,我们指需要把这个注册器对象传递给一个函数(而不是分别传递三个对象)。看下面的例子:
    复制代码 代码如下:

    <?php
    function test(&$registry) {
        $db =& $registry->get('db');
        $settings =& $registry->get('settings');
        $user =& $registry->get('user');
        // Do something with the objects
    }
    ?>

    注册器相比其他的方法来说,它的一个很大的改进就是当我们需要在我们的代码中新增加一个对象的时候,我们不再需要改变所有的东西(译者注:指程序中所有用到全局对象的代码),我们只需要在注册器里面新注册一个对象,然后它(译者注:新注册的对象)就立即可以在所有的组件中调用。

    为了更加容易的使用注册器,我们把它的调用改成单件模式(译者注:不使用前面提到的函数传递)。因为在我们的程序中只需要使用一个注册器,所以单件模式使非常适合这种任务的。在注册器类里面增加一个新的方法,如下所示:
    复制代码 代码如下:

    <?
    function &getInstance() {
        static $me;
        if (is_object($me) == true) {
            return $me;
        }
        $me = new Registry;
        return $me;
    }
    ?>

    这样它就可以作为一个单件来使用,比如:
    复制代码 代码如下:

    <?php
    $db = new DBConnection;
    $settings = new Settings_XML;
    $user = new User;
    // Register objects
    $registry =& Registry::getInstance();
    $registry->set ('db', $db);
    $registry->set ('settings', $settings);
    $registry->set ('user', $user);
    function test() {
        $registry =& Registry::getInstance();
        $db =& $registry->get('db');
        $settings =& $registry->get('settings');
        $user =& $registry->get('user');
        // Do something with the objects
    }
    ?>

    正如你看到的,我们不需要把私有的东西都传递到一个函数,也不需要使用“global”关键字。所以注册器模式是这个问题的理想解决方案,而且它非常的灵活。

  • 相关阅读:
    Nbimer族助手 部分控件不能用的解决方法(转)
    jquery中通过全局变量来禁止多次ajax请求
    Three.JS 从世界坐标系转换到屏幕坐标系
    php 判断是手机版还是电脑端
    6个html5页面适配iphone6的技巧
    http://stackoverflow.com/questions/6065169/requestanimationframe-with-this-keyword
    javascript模仿php 函数 trim ltrim rtrim (原创)
    JavaScript中Trim(),TrimStart(),TrimEnd()的实现
    如何定位摄像机,使物体在屏幕上始终具有相同的像素宽度和高度?(threes)
    鸿基台式机安装
  • 原文地址:https://www.cnblogs.com/myyuanyuan/p/6902077.html
Copyright © 2020-2023  润新知