🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 5-3 注册树模式 正常情况下,我们现在获取对象的方法主要有2种: * new 实例化 * 访问静态方法 那么有没有一种可能,我们可以直接获取1个已经创建好的对象呢?这就是本节所讲的注册模式。 ### 第一步:创建1个注册类 *D:\wamp\www\demo\oop\framework\Think\Register.php* ~~~ <?php namespace Think; class Register { protected static $obj = array(); static function set($alias, $object) { self::$obj[$alias] = $object; } function _unset($alias) { unset(self::$obj[$alias]); } } ~~~ 声明了1个 `set()` 方法,将对象注册。 声明1个 `_unset()` 方法 (不能和 `unset()` 关键字重名),在下文中需要的时候销毁对象。 ### 第二步:改造工厂类 在工厂类中,实例化生成对象后,将之注册 *D:\wamp\www\demo\oop\framework\Think\Factory.php* ~~~ static function createDatabase() { $db = Database::getDbInstance(); // 注册模式之注册 Register::set('db1', $db); return $db; } ~~~ ### 第三步:在入口文件使用注册模式 不同于以往的获取对象的方式,这里不使用 `new` 也不使用静态方法获取。 *D:\wamp\www\demo\oop\framework\index.php* ~~~ <?php ... // 工厂模式实例化对象,并注册 $obj = Think\Factory::createDatabase(); // 注册后,获取该对象 $obj = Think\Register::get('db1'); var_dump($obj); ~~~ 使用注册类中的 `get()` 方法获取对象。 ### 第四步:编写 get() 方法 *D:\wamp\www\demo\oop\framework\Think\Register.php* ~~~ static function get($alias) { return self::$obj[$alias]; } ~~~ 至于何时把对象注册到树,何时注销,都在环境的初始化中完成,在业务的逻辑过程中,我们只需要使用 `get()` 方法获取对象。