有幾行代碼不是太懂,請高手幫忙分析
這個代碼摘自ThinkPHP架構裡的某個小片段
PHP code
/** +---------------------- * 取得對象執行個體 支援調用類的靜態方法 +---------------------- * @param string $class 對象類名 * @param string $method 類的靜態方法名 +---------------------- * @return object +---------------------- */ static public function instance($class,$method='') { $identify = $class.$method; if(!isset(self::$_instance[$identify])) { //這一行的self::不是太明白怎麼回事 if(class_exists($class)){ //這個是判斷如果類存在? $o = new $class(); if(!empty($method) && method_exists($o,$method)) self::$_instance[$identify] = call_user_func_array(array(&$o, $method)); //這一行怎麼解釋? else self::$_instance[$identify] = $o; //這一行怎麼解釋? } else halt(L('_CLASS_NOT_EXIST_').':'.$class); //halt從來沒見過這東西…… } return self::$_instance[$identify]; }
------解決方案--------------------
假設這個類的名稱: Core.php
Core.php裡面有一個靜態屬性
public static $_instance //注意這個屬性是數組。
這函數實現了兩種功能:
1. 工廠類:用於建立對象。 如果方法為空白,則返回類。
2. 執行某個類的方法。 方法不為空白則返回方法執行的結果。
if(!isset(self::$_instance[$identify])) { //靜態方法的引用要用Self 。 Self:表示當前類本身,不是當前對象。
if(class_exists($class)){ //這個是判斷這個類檔案是否存在,當然這個是封裝後的方法。你可以理解為IO操作中 File_exist(filename).
self::$_instance[$identify] = call_user_func_array(array(&$o, $method)); // 這個實際上是反射調用某個類的方法。
self::$_instance[$identify] = $o; // 如果方法名稱為空白,就把對象放入數組中。
halt(L('_CLASS_NOT_EXIST_').':'.$class); //halt 單詞意思是停止。 好像是停止編譯吧。
------解決方案--------------------
okayu已經解釋的很好了
------解決方案--------------------
這函數實現了兩種功能:
1. 工廠類:用於建立對象。 如果方法為空白,則返回類。
2. 執行某個類的方法。 方法不為空白則返回方法執行的結果。
------------------------
讀代碼要從大局著眼。
解釋的真不錯。也跟著學習了。
從大入小。
------解決方案--------------------
這個類是一註冊類! 不能說是工場類!有局限性
1) 如果是類沒有初始化,則初始化,存在類屬性數組中;如果類已初始化,則返回已初始化的類。(工場類應該每次均返回一個新執行個體;
2) 如果有方法,但返回調用方法的結果。(無法傳參,調用的是任意方法,而不是所說的靜態方法)
call_user_func_array(array(&$o, $method)) 這裡的&不知有沒有必要。
------解決方案--------------------
&$o 在php中 貌似就是$o
和C的指標類似 但又有區別!
------解決方案--------------------
探討
這個類是一註冊類! 不能說是工場類!有局限性
1) 如果是類沒有初始化,則初始化,存在類屬性數組中;如果類已初始化,則返回已初始化的類。(工場類應該每次均返回一個新執行個體;
2) 如果有方法,但返回調用方法的結果。(無法傳參,調用的是任意方法,而不是所說的靜態方法)
call_user_func_array(array(&$o, $method)) 這裡的&不知有沒……