程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP設計模式(三),php設計模式

PHP設計模式(三),php設計模式

編輯:關於PHP編程

PHP設計模式(三),php設計模式


  • 注冊器模式

這種模式比較簡單好理解,在PHP框架中會經常用到,在某些比較大的PHP框架中,會在初始化時將一些常用的類實例放在注冊器中,實際是存在注冊器類中的一個靜態數組中,以後想去用它的話,直接根據名稱就可以獲取到注冊器中保存的實例。而不需要再次去new這個類、getInstance或者工廠方法獲得。我感覺這種模式有點像是把單例模式和簡單工廠模式結合起來了,實例化之後保存在一個靜態數組中(類似單例模式的靜態變量),然後可以根據不同的參數去獲取注冊過的實例,這裡跟簡單工廠模式相比較的話,他可以動態的添加實例進去,而不需要去修改代碼,但這裡要注意的就是必須先注冊才可以獲取。

這個模式要注意幾個要點:

1. 首先就是要一個管理要注冊的實例的類(例如:Register),我們就加他注冊類吧。

2. 這個注冊類必須有一個靜態數組變量,采用鍵值數組(哈希)方式存儲這些注冊的實例,其中鍵對應實例名,值對應實例。

3. 當然了,_set、_get、_unset(采用下劃線開始僅僅是因為unset是關鍵字,然後為了統一,就都加上了)這些方法都不能少,用來設置、獲取、和銷毀注冊器中的內容。

4. 其實這個注冊類可以看做是一個裝載和卸載的過程,使用前進行裝載,當這個實例不在使用時就可以卸載了。

4. 這裡還需要注意,不能放太多的實例進去,有些實例用一次就可以銷毀掉了就不用保存到注冊器中,免得浪費空間。

5. 注冊器中不同的名稱是可以保存相同的實例的,因為他保存時是有名稱作為索引。

<?php
/**
 * 注冊器模式——例子
 * @author 燕睿濤([email protected])
 */
class Register{
    /**
     * @var array $objects
     * 用來保存注冊過的實例的變量
     */
    private static $_objects = array();

    /**
     * 注冊一個實例到注冊器中
     * @param string $name 要注冊的類名
     * @param object $obj 要注冊的類實例
     * @return true
     */
    public static function _set($name,$obj){
        if(!isset(self::$_objects[$name])){
            self::$_objects[$name] = $obj;
        }
        return true;
    }

    /**
     * 從注冊器中解除一個實例
     * @param string $name 要注冊的類名
     * @return true
     */
    public static function _unset($name){
        if(isset(self::$_objects[$name])){
            unset(self::$_objects[$name]);
        }
        return true;
    }    

    /**
     * 從注冊器中獲取一個實例
     * @param string $name 要注冊的類名
     * @return object/false 
     */
    public static function _get($name){
        if(isset(self::$_objects[$name])){
            return self::$_objects[$name];
        }
        return false;
    }        
}

class Man{
    public function say(){
        echo "My name is Users!!";
    }
}

Register::_set('man1',new Man());
Register::_get('man1')->say();

send Me~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved