我放弃Smarty的一次经验,和兄弟们分享一下,请兄弟们PP^^

aboutagirl 2005-04-19 03:58:58
原文在我的论坛:http://www.ipbfans.org/topic22

我一直很郁闷的就是,写程序的时候必须在模板和PHP之间来回奔波,每用一种模板,都要适应它们的语法,抱怨它们的不足。

至于模板的好处,我就不说了,网上多的是。

为什么不用传统的html和php混合编写的方式?各有各的看法。
根据我的经验,如果用模板,至少有两个缺点:

1、速度
不管哪一种模板,都要将模板语言转换成PHP语句,即使是号称有“编译”功能的Smarty、smarttemplate等等。尤其是Smarty,Smarty过于庞大和复杂,即使经过编译,php程序每次还是得初始化Smarty类、经过一系列判断……
如果你去看看Smarty缓存文件,或许你会觉得,里面的代码象你刚学php的时候写的……

2、功能
在用模板写程序的时候,“多种循环”和“文件嵌套”经常会将人折磨的很郁闷,反正我在刚开始用这些模板的时候就是。
如果直接用混合PHP和html的方式,这种问题马上就迎刃而解了。


最近做的一个项目里面,一直被Smarty的庞大和效率所困扰,最终决定放弃这个庞然大物,选择了最古老的PHP与HTML代码混合的方式。但是姑且还是将其称为“模板”吧。

用Smarty的时候,我是自己写了一个类,按照phplib的方法名重写封装了一下Smarty。决定放弃Smarty以后,模板文件肯定要全部重写,但是为了尽量减少程序的修改,我将这个类全部重新改写了,去处了所有与Smarty相关的代码,取而代之的是下面这个简单的类:
CODE
<?php


class ezj_template
{
/**
* @access public
* @var string
*/
var $t_dir = '';
var $skin = '';
var $common = '';
var $template_cfg = array();
var $main = '';
var $vars = array();

function ezj_template()
{
global $ezj;

$this->t_dir = ROOT_PATH . $ezj->cache['template']['tpl_path'] . '/';

@include( $this->t_dir . '_config.php' );
$this->template_cfg = $_template_config;
}//-- end of constructor

/*
* 将模板内容输出到浏览器
@param string $cache_id
@param string $compile_id
@access public
@return void
*/
function output($cache_id = null, $compile_id = null)
{
global $ezj , $db;

require_once( VIEWS . 'template/class.template_common.php' );
$this->common = new template_common(&$this);
$this->common->run();

@header("HTTP/1.0 200 OK");
@header("HTTP/1.1 200 OK");
@header("Content-type: text/html;charset=utf-8");

if ($ezj->vars['header_no_cache'])
{
@header("Cache-Control: no-cache, must-revalidate, max-age=0");
@header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
@header("Pragma: no-cache");
}

if ( $ezj->vars['gunzip_enabled']==1 )
{
$buffer = @ob_get_contents();
@ob_end_clean();
@ob_start('ob_gzhandler');
print $buffer;
}

extract($this->vars);
$t = &$this->t_dir;

@include_once( $t . $this->main );

if ( defined('WITHOUT_SHUTDOWN') )
{
$ezj->_destruct();
}
}//-- end of method `output`

function set_var($tpl_var, $value = null)
{
$this->assign($tpl_var , $value);
}

function set_file($file)
{
$this->main = $file;
}

function assign($var , $value=null)
{
if ( is_array($var) )
{
foreach($var as $k=>$v)
{
$this->vars[$k] = $v;
}
}else
{
$this->vars[$var] = $value;
}
}
}//-- end of class `ezj_template`
?>


...全文
579 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
skystar008 2005-04-22
  • 打赏
  • 举报
回复
PHPLIB smarty smartytemplate都用过,感觉smarty的速度优势并没有多大,
曾经开启过它的缓存功能,但用在session实时更新时,不得不关闭它,然后用
它的cache_handler将它存在数据库中,但速度并没有改变多少。
不知道是不是自己没有用好的缘故,大家觉得呢?
公亮 2005-04-21
  • 打赏
  • 举报
回复
模板?
什么意思?
我一直在用模板
可是我不知道那是属于什么?
volca 2005-04-21
  • 打赏
  • 举报
回复
我觉得你可以尝试用Savant模板,简单,而且直接使用php语法,
http://phpsavant.com/yawiki/index.php?area=Savant2&page=StartExample

见下面的例子:
Model Logic
<?php
require_once 'Savant2.php';
$tpl =& new Savant2();

// Create a title.
$name = "Some Of My Favorite Books";

// Generate an array of book authors and titles.
$booklist = array(
array(
'author' => 'Hernando de Soto',
'title' => 'The Mystery of Capitalism'
),
array(
'author' => 'Milton Friedman',
'title' => 'Free to Choose'
)
);

// Assign values to the Savant instance.
$tpl->assign('title', $name);
$tpl->assign('books', $booklist);

// Display a template using the assigned values.
$tpl->display('books.tpl.php');
?>

View Logic

<?php if (is_array($this->books)): ?>

<!-- A table of some books. -->
<table>
<tr>
<th>Author</th>
<th>Title</th>
</tr>

<?php foreach ($this->books as $key => $val): ?>
<tr>
<td><?php echo $val['author'] ?></td>
<td><?php echo $val['title'] ?></td>
</tr>
<?php endforeach; ?>

</table>

<?php else: ?>

<p>There are no books to display.</p>

<?php endif; ?>


这个开发大型网站是没一点问题的,为什么呢?我已经实践过了
mrshelly 2005-04-21
  • 打赏
  • 举报
回复
我喜欢用PHPLIB~~~~~~~~~~~~的模板。
bthl 2005-04-21
  • 打赏
  • 举报
回复
FASTTEMPLATE
clifftang 2005-04-21
  • 打赏
  • 举报
回复
如果想把程序弄复杂 就推荐用!
Lesleezh 2005-04-21
  • 打赏
  • 举报
回复
我一直用Lib,感觉很不错!
flyfeicsdn 2005-04-20
  • 打赏
  • 举报
回复
smarty的这种设计思路是很好的.只是要求美工人员也要了解她的这种模板语言.但是我想没有美工愿意学,所以遇到更换样式上的事情又要我们来改.

使用了phplib和smarty之后,觉得smarty是为实现mvc而生的.比如一个新闻发布系统,具有import(重要)这样一个属性,逻辑尚只要把这个属性传递给模板变量就可以了,具体怎么显示是view决定,可以是加粗,
可以是在标题之后加上一个有特殊标记的图片....总之由你决定.这一点是很爽的.

好了.罗索了这么多,各位高人有什么感想说出来听听.
genshing 2005-04-20
  • 打赏
  • 举报
回复
偶觉得还是HTML和PHP分开的好

Smarty庞大有它的作用,虽然循环的嵌套等等...对于美工来说比接触php代码好不了多少...

但是采用了Smarty以后,网站的改版,程序的变换等等都会很方便的
jaexc 2005-04-20
  • 打赏
  • 举报
回复
SMARTY体积大 功能强
我比较喜欢SMARTTEMPLATE的哈,小又快
erldy 2005-04-20
  • 打赏
  • 举报
回复
楼主应该还没很深入去应用模板技术吧?
用SMARTY来做小型网站简直就是“杀鸡用牛刀”!
其实最好根据你自己的项目来选择模板引擎,小型的可以使用PHPLIB,中大型的那就选择SMARTTEMPLATE或者SMARTY。
uuq 2005-04-20
  • 打赏
  • 举报
回复
还是分离好。你看下你的站点是什么样子。
用什么模板。
虽然效率低点也可以。我们维护方便了
aboutagirl 2005-04-19
  • 打赏
  • 举报
回复
我接触的很多美工,对他们来说写{$var xxx=xxx}之类的语句和写PHP语句一样:都不懂。

既然Smarty可以处理{$var charset = "GB2312" prefix = "xxxx-" color="#FF0000" ...}这样的变量,那么在Smarty内部,是不是也诚如所言 ,做了N次这样的判断呢?我想也应该是吧(我没太深刻的研究过Smarty的,所以不确定)
Meteorlet 2005-04-19
  • 打赏
  • 举报
回复
这是结构描述语言跟解释型、编译型语言的区别,你不能指望一种语言来统一它们。解释型、编译型语言能完全实现你的逻辑,模板语言能描述你的输出,但是模板语言不是独立存在,是要靠PHP或者其它CGI语言来分析的。一旦模板语言独立存在,就跟XSL描述XML一样,就缺乏了CGI程序的可交互性了。而且模板语言只能定义简单的逻辑,复杂的逻辑控制都是在PHP里做的,这也是为什么提出MVC的概念。你的想法只对于简单的小型网站适用。用统一的格式来处理变量是可以的,比如你把变量都放入$GLOBALS,然后用array_map映射一个函数来统一处理这些变量,但是你总得用个标志来表明哪些变量需要处理,哪些不需要处理吧?你的标志放哪?如果有10个标志,用PHP就要判断10次,描述就不会象{$var charset = "GB2312" prefix = "xxxx-" color="#FF0000" ...}这么简单了,而且美工设计也不用知道PHP怎么写的,只要知道几个属性参数就行了。让PHP识别{$var charset = "GB2312" prefix = "xxxx-" color="#FF0000" ...}这样的语法是很困难的,因为charset,prefix,color这种属性是自定义的,PHP要规定死了就缺乏灵活性了。
tony-杨 2005-04-19
  • 打赏
  • 举报
回复
又学了不少
呵呵~~~~~~~~
关于Smarty的东西
aboutagirl 2005-04-19
  • 打赏
  • 举报
回复
看样子真的是我才疏学浅了,Smarty用的不好,这些好处我没有体会到。
凡事都有它的适用范围,Smarty有它存在的理由,我想我只是换了一种思路来考虑我项目中的“模板”这个问题,我并没有发明一种我自己的所谓“模板”。

更让我困惑的是,为什么非得要php文件使用一种语言(php本身),模板又要换一种语言,Smarty既然可以以那种统一的格式来处理变量,难道PHP语言本身就不可以?
Meteorlet 2005-04-19
  • 打赏
  • 举报
回复
单纯从效率来说,当然是混合写高,但是从可读性,结构性,扩展性和维护性来说混合写都不是最佳的。Smarty之所以这么做也是经过考虑的,不是你觉得不好就能否认的。只能说明没有实践经验,没遇到复杂的情况,建议你可以看看许多优秀的PHP开源代码。举个例子给你看看:
比如字符串的输出,可以有很多格式:
如果需要全部大小输出:按照你的逻辑应该是: <?= $var ?>
这样所有需要大写输出的地方你都得加: <?php $var = touppercase($var);?> 那什么时候需要输出什么时候不需要输出都是你规定的,美工怎么知道?
而用Smarty这些都可以全部统一的:{$var upppercase="true"}
还有日期格式的输出:{$var format="xxxx年xx月xx日"} {$var format="xxxx-xx-xx"}
还有加密方式: {$var encode="base64" upppercase="true" attribute="password"}

用你的模板技术能做到吗?因为你的设计思想里压根就没这一点。你最多规定一种格式,要另一种格式输出你又得改源码,还有各种组合格式,一来一去开发效率就不高,这时候你会觉得Smarty设计得很巧妙和实用。
aboutagirl 2005-04-19
  • 打赏
  • 举报
回复
楼上的曲解了一部分我的意思,我说“如果你去看看Smarty缓存文件,或许你会觉得,里面的代码象你刚学php的时候写的……”,是指PHP和HTML混合的方式,在此并没有贬低Smarty的意思。

不过我还是觉得,任何模板技术,都不及单纯的php与html混合效率高。
Meteorlet 2005-04-19
  • 打赏
  • 举报
回复
你是不是没有理解编译性模板?简单的说就是把模板语言翻译成HTML跟PHP混合编排,不是你这么理解:“如果你去看看Smarty缓存文件,或许你会觉得,里面的代码象你刚学php的时候写的……”,缓存文件就是编译以后的根本不是给你看的,就好比你写个C语言程序,运行都是.exe文件,你看exe文件干什么?对于编译过的文件,Smarty是这么做的:搜索编译文件是否存在,存在则包含进来,不然重新编译生成新的,你觉得它这样做效率很低吗?只能说你没有理解Smarty,不要怀疑这么多程序员智慧的结晶,先怀疑一下自己。再说,你这种代码:
<?php if ( $_tpl_cfg_show_search ) { ?>
<?php include($t.'include/search.php');?>
<?php } ?>
肯定没有
<IfConfigShowSearch>
<Include Filename="include/search.php">
</IfConfigShowSearch>
这样的模板语言简练好看,还能定义成XML格式的,这就是Smarty的扩展性很好。
ccxxcc 2005-04-19
  • 打赏
  • 举报
回复
刚接触模板,小声问一下
phplib是不是比Smarty小一些?不是“庞然大物”
加载更多回复(4)

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧