下部这段另类的写法是为了啥
下面这段另类的写法是为了啥
下面这段写法中,问题一:构造函数里面竞然是空的,并且更另类的是他的下面竟然是实例化,如果构造函数是空的,下面如何实例化呢
道理是啥?
<?php<br />/**<br /> * 模板驱动<br /> *<br /> * 模板驱动,商城模板引擎<br /> *<br /> *<br /> * @package tpl<br /> * @copyright Copyright (c) 2007-2013 ShopNC Inc. (http://www.shopnc.net)<br /> * @license http://www.shopnc.net<br /> * @link http://www.shopnc.net<br /> * @author ShopNC Team<br /> * @since File available since Release v1.1<br /> */<br />defined('InShopNC') or exit('Access Invalid!');<br />class Tpl{<br /> /**<br /> * 单件对象<br /> */<br /> private static $instance = null;<br /> /**<br /> * 输出模板内容的数组,其他的变量不允许从程序中直接输出到模板<br /> */<br /> private static $output_value = array();<br /> /**<br /> * 模板路径设置<br /> */<br /> private static $tpl_dir='';<br /> /**<br /> * 默认layout<br /> */<br /> private static $layout_file = 'layout';<br /> <br /> private function __construct(){}<br /> <br /> /**<br /> * 实例化<br /> *<br /> * @return obj<br /> */<br /> public static function getInstance(){<br /> if (self::$instance === null || !(self::$instance instanceof Tpl)){<br /> self::$instance = new Tpl();<br /> }<br /> return self::$instance;<br /> }<br /> <br /> /**<br /> * 设置模板目录<br /> *<br /> * @param string $dir<br /> * @return bool<br /> */<br /> public static function setDir($dir){<br /> self::$tpl_dir = $dir;<br /> return true;<br /> }<br /> /**<br /> * 设置布局<br /> *<br /> * @param string $layout<br /> * @return bool<br /> */<br /> public static function setLayout($layout){<br /> self::$layout_file = $layout;<br /> return true;<br /> }<br /> <br /> /**<br /> * 抛出变量<br /> *<br /> * @param mixed $output<br /> * @param void<br /> */<br /> public static function output($output,$input=''){<br /> self::getInstance();<br /> <br /> self::$output_value[$output] = $input;<br /> }<br /> <br /> /**<br /> * 调用显示模板<br /> *<br /> * @param string $page_name<br /> * @param string $layout<br /> * @param int $time<br /> */<br /> public static function showpage($page_name='',$layout='',$time=2000){<br /> if (!defined('TPL_NAME')) define('TPL_NAME','default');<br /> self::getInstance();<br /> if (!empty(self::$tpl_dir)){<br /> $tpl_dir = self::$tpl_dir.DS;<br /> }<br /> //默认是带有布局文件<br /> if (empty($layout)){<br /> $layout = 'layout'.DS.self::$layout_file.'.php';<br /> }else {<br /> $layout = 'layout'.DS.$layout.'.php';<br /> }<br /> $layout_file = BASE_PATH.'/templates/'.TPL_NAME.DS.$layout;<br /> $tpl_file = BASE_PATH.'/templates/'.TPL_NAME.DS.$tpl_dir.$page_name.'.php';<br /> if (file_exists($tpl_file)){<br /> //对模板变量进行赋值<br /> $output = self::$output_value;<br /> //页头<br /> $output['html_title'] = $output['html_title']!='' ? $output['html_title'] :$GLOBALS['setting_config']['site_name'];<br /> $output['seo_keywords'] = $output['seo_keywords']!='' ? $output['seo_keywords'] :$GLOBALS['setting_config']['site_name'];<br /> $output['seo_description'] = $output['seo_description']!='' ? $output['seo_description'] :$GLOBALS['setting_config']['site_name'];<br /> $output['ref_url'] = getReferer();<br /><br /> Language::read('common');<br /> $lang = Language::getLangContent();<br /><br /> @header("Content-type: text/html; charset=".CHARSET);<br /> //判断是否使用布局方式输出模板,如果是,那么包含布局文件,并且在布局文件中包含模板文件<br /> if ($layout != ''){<br /> if (file_exists($layout_file)){<br /> include_once($layout_file);<br /> }else {<br /> $error = 'Tpl ERROR:'.'templates'.DS.$layout.' is not exists';<br /> throw_exception($error);<br /> }<br /> }else {<br /> include_once($tpl_file);<br /> }<br /> }else {<br /> $error = 'Tpl ERROR:'.'templates'.DS.$tpl_dir.$page_name.'.php'.' is not exists';<br /> throw_exception($error);<br /> }<br /> }<br /> /**<br /> * 显示页面Trace信息<br /> *<br /> * @return array<br /> */<br /> public static function showTrace(){<br /> $trace = array();<br /> //当前页面<br /> $trace[Language::get('nc_debug_current_page')] = $_SERVER['REQUEST_URI'].'<br>';<br /> //请求时间<br /> $trace[Language::get('nc_debug_request_time')] = date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']).'<br>';<br /> //系统运行时间<br /> $query_time = number_format((microtime(true)-StartTime),3).'s';<br /> $trace[Language::get('nc_debug_execution_time')] = $query_time.'<br>';<br /> //内存<br /> $trace[Language::get('nc_debug_memory_consumption')] = number_format(memory_get_usage()/1024/1024,2).'MB'.'<br>';<br /> //请求方法<br /> $trace[Language::get('nc_debug_request_method')] = $_SERVER['REQUEST_METHOD'].'<br>';<br /> //通信协议<br /> $trace[Language::get('nc_debug_communication_protocol')] = $_SERVER['SERVER_PROTOCOL'].'<br>';<br /> //用户代理<br /> $trace[Language::get('nc_debug_user_agent')] = $_SERVER['HTTP_USER_AGENT'].'<br>';<br /> //会话ID<br /> $trace[Language::get('nc_debug_session_id')] = session_id().'<br>';<br /> //执行日志<br /> $log = Log::read();<br /> $trace[Language::get('nc_debug_logging')] = count($log)?count($log).Language::get('nc_debug_logging_1').'<br/>'.implode('<br/>',$log):Language::get('nc_debug_logging_2');<br /> $trace[Language::get('nc_debug_logging')] = $trace[Language::get('nc_debug_logging')].'<br>';<br /> //文件加载<br /> $files = get_included_files();<br /> $trace[Language::get('nc_debug_load_files')] = count($files).str_replace("\n",'<br/>',substr(substr(print_r($files,true),7),0,-2)).'<br>';<br /> return $trace;<br /> }<br />}<br />
------解决思路----------------------
这种写法是单例模式。
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
http://baike.baidu.com/view/1859857.htm
------解决思路----------------------
构造函数是否为空,和实例化没有关系
构造函数为空,只不过表示实例化时没有用户自定义动作。并且也不执行父类(如果有的话)的构造函数
private function __construct(){}
表示该类不能在外部实例化,私有方法只能在定义它的类里面访问
在类外面 new Tpl
将会有一个 Call to private Tpl::__construct() from invalid context 的致命错误
这是单例模式的写法,但少了
private function __clone(){}
如果单例模式的对象能被克隆的话,就违背了单例的初衷
对于你的这个类,单不单例已经没有意义了,因为他所有的属性和方法都是静态的
因为静态的属性是在各实例间共享的

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

「你的組織要求你更改PIN訊息」將顯示在登入畫面上。當在使用基於組織的帳戶設定的電腦上達到PIN過期限制時,就會發生這種情況,在該電腦上,他們可以控制個人設備。但是,如果您使用個人帳戶設定了Windows,則理想情況下不應顯示錯誤訊息。雖然情況並非總是如此。大多數遇到錯誤的使用者使用個人帳戶報告。為什麼我的組織要求我在Windows11上更改我的PIN?可能是您的帳戶與組織相關聯,您的主要方法應該是驗證這一點。聯絡網域管理員會有所幫助!此外,配置錯誤的本機原則設定或不正確的登錄項目也可能導致錯誤。即

Windows11將清新優雅的設計帶到了最前沿;現代介面可讓您個性化和更改最精細的細節,例如視窗邊框。在本指南中,我們將討論逐步說明,以協助您在Windows作業系統中建立反映您的風格的環境。如何更改視窗邊框設定?按+開啟“設定”應用程式。 WindowsI前往個人化,然後按一下顏色設定。顏色變更視窗邊框設定視窗11「寬度=」643「高度=」500「>找到在標題列和視窗邊框上顯示強調色選項,然後切換它旁邊的開關。若要在「開始」功能表和工作列上顯示主題色,請開啟「在開始」功能表和工作列上顯示主題

預設情況下,Windows11上的標題列顏色取決於您選擇的深色/淺色主題。但是,您可以將其變更為所需的任何顏色。在本指南中,我們將討論三種方法的逐步說明,以更改它並個性化您的桌面體驗,使其具有視覺吸引力。是否可以更改活動和非活動視窗的標題列顏色?是的,您可以使用「設定」套用變更活動視窗的標題列顏色,也可以使用登錄編輯程式變更非活動視窗的標題列顏色。若要了解這些步驟,請前往下一部分。如何在Windows11中變更標題列的顏色? 1.使用「設定」應用程式按+開啟設定視窗。 WindowsI前往“個人化”,然

工作列縮圖可能很有趣,但它們也可能分散注意力或煩人。考慮到您將滑鼠懸停在該區域的頻率,您可能無意中關閉了重要視窗幾次。另一個缺點是它使用更多的系統資源,因此,如果您一直在尋找一種提高資源效率的方法,我們將向您展示如何停用它。不過,如果您的硬體規格可以處理它並且您喜歡預覽版,則可以啟用它。如何在Windows11中啟用工作列縮圖預覽? 1.使用「設定」應用程式點擊鍵並點選設定。 Windows按一下系統,然後選擇關於。點選高級系統設定。導航至“進階”選項卡,然後選擇“效能”下的“設定”。在「視覺效果」選

您是否在Windows安裝程式頁面上看到「出現問題」以及「OOBELANGUAGE」語句? Windows的安裝有時會因此類錯誤而停止。 OOBE表示開箱即用的體驗。正如錯誤提示所表示的那樣,這是與OOBE語言選擇相關的問題。沒有什麼好擔心的,你可以透過OOBE螢幕本身的漂亮註冊表編輯來解決這個問題。快速修復–1.點選OOBE應用底部的「重試」按鈕。這將繼續進行該過程,而不會再打嗝。 2.使用電源按鈕強制關閉系統。系統重新啟動後,OOBE應繼續。 3.斷開系統與網際網路的連接。在脫機模式下完成OOBE的所

在Windows11上的顯示縮放方面,我們都有不同的偏好。有些人喜歡大圖標,有些人喜歡小圖標。但是,我們都同意擁有正確的縮放比例很重要。字體縮放不良或圖像過度縮放可能是工作時真正的生產力殺手,因此您需要知道如何自訂以充分利用系統功能。自訂縮放的優點:對於難以閱讀螢幕上的文字的人來說,這是一個有用的功能。它可以幫助您一次在螢幕上查看更多內容。您可以建立僅適用於某些監視器和應用程式的自訂擴充功能設定檔。可以幫助提高低階硬體的效能。它使您可以更好地控制螢幕上的內容。如何在Windows11

螢幕亮度是使用現代計算設備不可或缺的一部分,尤其是當您長時間注視螢幕時。它可以幫助您減輕眼睛疲勞,提高易讀性,並輕鬆有效地查看內容。但是,根據您的設置,有時很難管理亮度,尤其是在具有新UI更改的Windows11上。如果您在調整亮度時遇到問題,以下是在Windows11上管理亮度的所有方法。如何在Windows11上變更亮度[10種方式解釋]單一顯示器使用者可以使用下列方法在Windows11上調整亮度。這包括使用單一顯示器的桌上型電腦系統以及筆記型電腦。讓我們開始吧。方法1:使用操作中心操作中心是訪問

Windows上的啟動過程有時會突然轉向顯示包含此錯誤代碼0xc004f069的錯誤訊息。雖然啟動程序已經聯機,但一些運行WindowsServer的舊系統可能會遇到此問題。透過這些初步檢查,如果這些檢查不能幫助您啟動系統,請跳到主要解決方案以解決問題。解決方法–關閉錯誤訊息和啟動視窗。然後,重新啟動電腦。再次從頭開始重試Windows啟動程序。修復1–從終端啟動從cmd終端啟動WindowsServerEdition系統。階段–1檢查Windows伺服器版本您必須檢查您使用的是哪種類型的W
