MVC框架(四)驅動類 - 工廠模式
阿新 • • 發佈:2017-05-16
同時 exist class ... string obj 所有 獲取對象 ret
將框架中大部分要創建的對象,都經由驅動類創建,獲取,判斷。這樣做有如下好處:
1 統一管理所有創建的類,包括創建前處理與創建後處理
2 單一創建,防止多次創建類
實例:
<?php /** *驅動類 - 工廠模式 */ abstract class Driver //抽象類 { // 配置數組 protected static $configs = array (); // 實例數組 protected static $instance = array (); public static function init() {
........//初始化處理,可以加載類的base基類等其他操作 $driver= get_called_class(); //獲取調用的類名 $className = $driver . ‘Base‘; if (! class_exists($className, false)) { ........ } } /** * 創建驅動實例 * * @param string $name * @param string $alias * @param array $args * @return mixed*/ public static function create($name, $alias = ‘‘) { $name = ucfirst($name); $driver = get_called_class(); //獲取調用的類名 // 類名 $className = $driver . $name; // 是否存在該類實例 if (isset(self::$instance[$driver][$alias])) { return self::$instance[$driver][$alias]; //防止多次創建 }else { // 驅動路徑 $fileName = "{$driver}/{$className}.class.php"; // 引入驅動文件 if (require_once $fileName) { // 實例化 $ref = new ReflectionClass($className); //反射類 $args = array_slice(func_get_args(), 2); //參數隔離 self::$instance[$driver][$alias] = $ref->newInstanceArgs($args); //反射類實例化,同時這裏會調用實例化類的構造方法,並傳遞參數 self::$configs[$driver][] = $className; } else { // 引入驅動失敗 return false; } // 返回實例 return self::$instance[$driver][$alias]; } } /** * 獲得驅動實例,不存在返回null * * @param type $name * @return mixed */ public static function getObj($name=‘‘) { static $driver; // 第一次獲取當前驅動名 if (null === $driver) { $driver = get_called_class(); } if (isset(self::$instance[$driver][$name])) { return self::$instance[$driver][$name]; } else { return null; } } public static function exists($name) { static $driver; // 第一次獲取當前驅動名 if (null === $driver) { $driver = get_called_class(); } return isset(self::$instance[$driver][$name]); } /** * 獲取驅動實例數量 * * @return int */ public static function length($name) { return count(self::$configs[$name]); } }
此處用了反射類
創建的時候用:
Db::create($option[‘type‘], $name, $option);
獲取對象實例:
$obj = self::getObj($name);
MVC框架(四)驅動類 - 工廠模式