问答详情
源自:5-4 [php]注册树模式

注册模式不理解,怎么就获取到了db1了?

提问者:xnceo 2014-11-20 21:16

个回答

  • sophietan
    2019-02-13 14:01:38

    class Register
    {
        protected static $objects;
    
        // 将一个对象注册到一个全局树上
        static function set($alias,$object)
        {
            self::$objects[$alias] = $object;
        }
    
    
        static function get($name)
        {
            return self::$objects[$name];
        }
    
    
        function _unset($alias)
        {
            unset(self::$objects[$alias]);
        }
    }

    在注册器类中 $Object 是静态属性对吧,因此其生命周期等同全局变量的生命周期,程序结束后才会被销毁。因此在你需要的地方这样调用

    $db = DataBase::getInstance(); // DataBse对象
    
    Register::set('db1',$db); // 把对象$db注册到全局树上它的别名为db1

    如果你是跟着Rango写的使用的时候记得先调用一下工厂方法createDatabase()去获取db对象,因为老师的注册方法写在工厂方法里的

    namespace IMooc;
    
    
    class Factory
    {
        static function createDatabase()
        {
            $db = DataBase::getInstance();
    
            Register::set('db1',$db);
    
            return $db;
        }
    }

    你在入口文件index.php中,这样来调用:

    // 注册树模式 注意一般注册对象会放在项目初始化的位置
    $db = IMooc\Factory::createDatabase();
    
    $db1 = \IMooc\Register::get('db1');
    
    var_dump($db1);

    打印结果就不会是NULL啦