## 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()` 方法獲取對象。
- 序言
- 第1章 課程簡介
- 1-1 大話PHP設計模式課程簡介
- 第2章 開發環境準備
- 2-1 關于PHPStorm使用
- 2-2 關于編程字體選擇
- 2-3 關于運行環境搭建
- 第3章 命名空間與Autoload
- 3-1 關于命名空間
- 3-2 類自動載入
- 3-3 開發一個PSR-0的基礎框架
- 第4章 PHP面向對象
- 4-1 SPL標準庫簡介
- 4-2 PHP鏈式操作的實現
- 4-3 PHP魔術方法的使用
- 第5章 三種基礎設計模式
- 5-1 工廠模式
- 5-2 單例模式
- 5-3 注冊樹模式
- 第6章 適配器模式
- 6-1 適配器模式
- 第7章 策略模式
- 7-1 策略模式的實現和使用
- 7-2 策略模式的控制反轉
- 第8章 數據對象映射模式
- 8-1 數據對象映射模式之簡單案例實現
- 8-2 數據對象映射模式之復雜案例實現
- 第9章 觀察者模式
- 第10章 原型模式
- 第11章 裝飾器模式
- 第12章 迭代器模式
- 第13章 代理模式
- 第14章 綜合實戰
- 14-1 面向對象設計基本原則
- 14-2 MVC結構
- 14-3 自動加載配置
- 14-4 從配置中生成數據庫連接
- 14-5 裝飾器模式在MVC中的使用
- 14-6 觀察者模式在MVC程序中的使用
- 14-7 代理模式在MVC程序中的使用
- 14-8 課程小結