下面這段寫法中,問題一:建構函式裡面競然是空的,並且更另類的是他的下面竟然是執行個體化,如果建構函式是空的,下面如何執行個體化呢
道理是啥?
'; //請求時間 $trace[Language::get('nc_debug_request_time')] = date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']).'
'; //系統已耗用時間 $query_time = number_format((microtime(true)-StartTime),3).'s'; $trace[Language::get('nc_debug_execution_time')] = $query_time.'
';//記憶體$trace[Language::get('nc_debug_memory_consumption')] = number_format(memory_get_usage()/1024/1024,2).'MB'.'
';//要求方法 $trace[Language::get('nc_debug_request_method')] = $_SERVER['REQUEST_METHOD'].'
'; //通訊協定 $trace[Language::get('nc_debug_communication_protocol')] = $_SERVER['SERVER_PROTOCOL'].'
'; //使用者代理程式 $trace[Language::get('nc_debug_user_agent')] = $_SERVER['HTTP_USER_AGENT'].'
'; //會話ID $trace[Language::get('nc_debug_session_id')] = session_id().'
'; //執行日誌 $log = Log::read(); $trace[Language::get('nc_debug_logging')] = count($log)?count($log).Language::get('nc_debug_logging_1').'
'.implode('
',$log):Language::get('nc_debug_logging_2'); $trace[Language::get('nc_debug_logging')] = $trace[Language::get('nc_debug_logging')].'
'; //檔案載入$files = get_included_files();$trace[Language::get('nc_debug_load_files')] = count($files).str_replace("\n",'
',substr(substr(print_r($files,true),7),0,-2)).'
'; return $trace; }}
回複討論(解決方案)
這種寫法是單例模式。
單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個執行個體而且該執行個體易於外界訪問,從而方便對執行個體個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
http://baike.baidu.com/view/1859857.htm
建構函式是否為空白,和執行個體化沒有關係
建構函式為空白,只不過表示執行個體化時沒有使用者自訂動作。並且也不執行父類(如果有的話)的建構函式
private function __construct(){}
表示該類不能在外部執行個體化,私人方法只能在定義它的類裡面訪問
在類外面 new Tpl
將會有一個 Call to private Tpl::__construct() from invalid context 的致命錯誤
這是單例模式的寫法,但少了
private function __clone(){}
如果單例模式的對象能被複製的話,就違背了單例的初衷
對於你的這個類,單不單例已經沒有意義了,因為他所有的屬性和方法都是靜態
因為靜態屬性是在各執行個體間共用的