0

0

下部这段另类的写法是为了啥

php中文网

php中文网

发布时间:2016-06-13 12:09:17

|

1604人浏览过

|

来源于php中文网

原创

下面这段另类的写法是为了啥
下面这段写法中,问题一:构造函数里面竞然是空的,并且更另类的是他的下面竟然是实例化,如果构造函数是空的,下面如何实例化呢
道理是啥? 
                                  

/**
* 模板驱动
*
* 模板驱动,商城模板引擎
*
*
* @package tpl
* @copyright Copyright (c) 2007-2013 ShopNC Inc. (http://www.shopnc.net)
* @license http://www.shopnc.net
* @link http://www.shopnc.net
* @author ShopNC Team
* @since File available since Release v1.1
*/
defined('InShopNC') or exit('Access Invalid!');
class Tpl{
/**
* 单件对象
*/
private static $instance = null;
/**
* 输出模板内容的数组,其他的变量不允许从程序中直接输出到模板
*/
private static $output_value = array();
/**
* 模板路径设置
*/
private static $tpl_dir='';
/**
* 默认layout
*/
private static $layout_file = 'layout';

private function __construct(){}

/**
* 实例化
*
* @return obj
*/
public static function getInstance(){
if (self::$instance === null || !(self::$instance instanceof Tpl)){
self::$instance = new Tpl();
}
return self::$instance;
}

/**
* 设置模板目录
*
* @param string $dir
* @return bool
*/
public static function setDir($dir){
self::$tpl_dir = $dir;
return true;
}
/**
* 设置布局
*
* @param string $layout
* @return bool
*/
public static function setLayout($layout){
self::$layout_file = $layout;
return true;
}

/**
* 抛出变量
*
* @param mixed $output
* @param void
*/
public static function output($output,$input=''){
self::getInstance();

self::$output_value[$output] = $input;
}

/**
* 调用显示模板
*
* @param string $page_name
* @param string $layout
* @param int $time
*/
public static function showpage($page_name='',$layout='',$time=2000){
if (!defined('TPL_NAME')) define('TPL_NAME','default');
self::getInstance();
if (!empty(self::$tpl_dir)){
$tpl_dir = self::$tpl_dir.DS;
}
//默认是带有布局文件
if (empty($layout)){
$layout = 'layout'.DS.self::$layout_file.'.php';
}else {
$layout = 'layout'.DS.$layout.'.php';
}
$layout_file = BASE_PATH.'/templates/'.TPL_NAME.DS.$layout;
$tpl_file = BASE_PATH.'/templates/'.TPL_NAME.DS.$tpl_dir.$page_name.'.php';
if (file_exists($tpl_file)){
//对模板变量进行赋值
$output = self::$output_value;
//页头
$output['html_title'] = $output['html_title']!='' ? $output['html_title'] :$GLOBALS['setting_config']['site_name'];
$output['seo_keywords'] = $output['seo_keywords']!='' ? $output['seo_keywords'] :$GLOBALS['setting_config']['site_name'];
$output['seo_description'] = $output['seo_description']!='' ? $output['seo_description'] :$GLOBALS['setting_config']['site_name'];
$output['ref_url'] = getReferer();

Language::read('common');
$lang = Language::getLangContent();

@header("Content-type: text/html; charset=".CHARSET);
//判断是否使用布局方式输出模板,如果是,那么包含布局文件,并且在布局文件中包含模板文件
if ($layout != ''){
if (file_exists($layout_file)){
include_once($layout_file);
}else {
$error = 'Tpl ERROR:'.'templates'.DS.$layout.' is not exists';
throw_exception($error);
}
}else {
include_once($tpl_file);
}
}else {
$error = 'Tpl ERROR:'.'templates'.DS.$tpl_dir.$page_name.'.php'.' is not exists';
throw_exception($error);
}
}
/**
* 显示页面Trace信息
*
* @return array
*/
public static function showTrace(){
$trace = array();
//当前页面
$trace[Language::get('nc_debug_current_page')] = $_SERVER['REQUEST_URI'].'
';
//请求时间
$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(){}
如果单例模式的对象能被克隆的话,就违背了单例的初衷

对于你的这个类,单不单例已经没有意义了,因为他所有的属性和方法都是静态的
因为静态的属性是在各实例间共享的

相关专题

更多
php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

15

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.13

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
XML教程
XML教程

共142课时 | 5.6万人学习

XSL-FO 教程
XSL-FO 教程

共14课时 | 6.4万人学习

SQL快速入门课程
SQL快速入门课程

共7课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号