下部这段另类的写法是为了啥
下面这段另类的写法是为了啥
下面这段写法中,问题一:构造函数里面竞然是空的,并且更另类的是他的下面竟然是实例化,如果构造函数是空的,下面如何实例化呢
道理是啥?
<?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脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++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前往“个性化”,然

您是否在Windows安装程序页面上看到“出现问题”以及“OOBELANGUAGE”语句?Windows的安装有时会因此类错误而停止。OOBE表示开箱即用的体验。正如错误提示所表示的那样,这是与OOBE语言选择相关的问题。没有什么可担心的,你可以通过OOBE屏幕本身的漂亮注册表编辑来解决这个问题。快速修复–1.单击OOBE应用底部的“重试”按钮。这将继续进行该过程,而不会再打嗝。2.使用电源按钮强制关闭系统。系统重新启动后,OOBE应继续。3.断开系统与互联网的连接。在脱机模式下完成OOBE的所

任务栏缩略图可能很有趣,但它们也可能分散注意力或烦人。考虑到您将鼠标悬停在该区域的频率,您可能无意中关闭了重要窗口几次。另一个缺点是它使用更多的系统资源,因此,如果您一直在寻找一种提高资源效率的方法,我们将向您展示如何禁用它。不过,如果您的硬件规格可以处理它并且您喜欢预览版,则可以启用它。如何在Windows11中启用任务栏缩略图预览?1.使用“设置”应用点击键并单击设置。Windows单击系统,然后选择关于。点击高级系统设置。导航到“高级”选项卡,然后选择“性能”下的“设置”。在“视觉效果”选

在Windows11上的显示缩放方面,我们都有不同的偏好。有些人喜欢大图标,有些人喜欢小图标。但是,我们都同意拥有正确的缩放比例很重要。字体缩放不良或图像过度缩放可能是工作时真正的生产力杀手,因此您需要知道如何对其进行自定义以充分利用系统功能。自定义缩放的优点:对于难以阅读屏幕上的文本的人来说,这是一个有用的功能。它可以帮助您一次在屏幕上查看更多内容。您可以创建仅适用于某些监视器和应用程序的自定义扩展配置文件。可以帮助提高低端硬件的性能。它使您可以更好地控制屏幕上的内容。如何在Windows11

屏幕亮度是使用现代计算设备不可或缺的一部分,尤其是当您长时间注视屏幕时。它可以帮助您减轻眼睛疲劳,提高易读性,并轻松有效地查看内容。但是,根据您的设置,有时很难管理亮度,尤其是在具有新UI更改的Windows11上。如果您在调整亮度时遇到问题,以下是在Windows11上管理亮度的所有方法。如何在Windows11上更改亮度[10种方式解释]单显示器用户可以使用以下方法在Windows11上调整亮度。这包括使用单个显示器的台式机系统以及笔记本电脑。让我们开始吧。方法1:使用操作中心操作中心是访问

在iOS17中,Apple为其移动操作系统引入了几项新的隐私和安全功能,其中之一是能够要求对Safari中的隐私浏览选项卡进行二次身份验证。以下是它的工作原理以及如何将其关闭。在运行iOS17或iPadOS17的iPhone或iPad上,如果您在Safari浏览器中打开了任何“无痕浏览”标签页,然后退出会话或App,Apple的浏览器现在需要面容ID/触控ID认证或密码才能再次访问它们。换句话说,如果有人在解锁您的iPhone或iPad时拿到了它,他们仍然无法在不知道您的密码的情况下查看您的隐私
