我赞同作者对smarty的见解,对作者的实现持保持态度
我认为我当前使用的模版类比smarty好很多
<?php
/**
* 视图层
*/
class qeeplay_mvc_ViewLayer
{
/**
* 该层所属的视图对象
*
* @var qeeplay_mvc_View
*/
public $view;
/**
* 父层对象
*
* @var viewlayer
*/
public $parent;
/**
* 视图名称
*
* @var string
*/
public $viewname;
/**
* 该层的内容
*
* @var string
*/
public $contents;
/**
* 该层区块的内容
*
* @var array
*/
public $blocks = array();
/**
* 该层的区块
*
* @var array
*/
private $_block_stack = array();
/**
* 预定义的区块
*
* @var array
*/
private $_predefined_blocks = array();
/**
* 构造函数
*
* @param qeeplay_mvc_View $view
* @param string $viewname
*/
function __construct(qeeplay_mvc_View $view, $viewname)
{
$this->view = $view;
$this->viewname = $viewname;
}
/**
* 返回该层的顶级层(最底层的视图)
*
* @return qeeplay_mvc_viewlayer
*/
function root()
{
return ($this->parent) ? $this->parent->root() : $this;
}
/**
* 分析视图,并返回结果
*
* @param array $predefined_blocks
*/
function parse(array $predefined_blocks = array())
{
$this->_predefined_blocks = $predefined_blocks;
ob_start();
extract($this->view->vars);
include $this->view->view_filename($this->viewname);
$this->contents = ob_get_clean();
$this->_predefined_blocks = null;
foreach ($this->blocks as $block_name => $contents)
{
$search = "%_view_block.{$block_name}_%";
if (strpos($this->contents, $search) !== false)
{
$this->contents = str_replace($search, $contents, $this->contents);
}
}
}
/**
* 从指定层继承
*
* @param string $viewname
*/
function extend($viewname)
{
$this->parent = new qeeplay_mvc_ViewLayer($this->view, $viewname);
}
/**
* 定义一个区块
*
* @param string $block_name
* @param boolean $append
*/
function block($block_name, $append = false)
{
array_push($this->_block_stack, array($block_name, $append));
ob_start();
}
/**
* 结束最后定义的一个区块
*/
function endblock()
{
list($block_name, $append) = array_pop($this->_block_stack);
$contents = ob_get_clean();
$this->_create_block($contents, $block_name, $append);
}
/**
* 定义一个空区块
*
* @param string $block_name
* @param boolean $append
*/
function empty_block($block_name, $append = false)
{
$this->_create_block('', $block_name, $append);
}
/**
* 载入一个视图片段
*
* @param string $viewname 视图片段名
*/
function element($viewname)
{
$__filename = $this->view->view_filename("_elements/{$viewname}");
extract($this->view->vars);
include $__filename;
}
/**
* 完成一个区块
*
* @param string $contents
* @param string $block_name
* @param boolean $append
*/
private function _create_block($contents, $block_name, $append)
{
if (isset($this->_predefined_blocks[$block_name]))
{
if ($append)
{
$contents .= $this->_predefined_blocks[$block_name];
}
else
{
$contents = $this->_predefined_blocks[$block_name];
}
}
$this->blocks[$block_name] = $contents;
echo "%_view_block.{$block_name}_%";
}
}
http://down.chinaz.com/test/201203/1741_1.htm 写道
在PHP界谈模板引擎,必不可免的要拿Smarty开刀,这个无比傻帽的却又带有一点点官方色彩的模板引擎。
如果没有我这样人富有正义感又富有创新精神的热血青年站出来,不知道它还要继续毒害多少那些处于花季而又对PHP充满美丽幻想的少年。
1.语法
你真的认为美工学得了 {foreach key=key item=item from=$contact} 这样的语法
却学不了 <?php foreach ($contact as $key=>$item) { ?> 吗?
而 {if $name eq "Fred" or $name eq "Wilma"}
又比<?php if ($name=='Fred' or $name=='Wilma') { ?> 优秀到哪里去?
首先我对美工会学Smarty语法始终保持怀疑态度,至少我工作这么多年还没遇到过一个会Smarty语法的,而就算美工愿意学,你又为何不教他正宗的PHP语法,却要教他一门连你自己搞不清楚的“Smarty语言”。
2.可视化
当页面从美工交接到你手上,然后你给那些完美的网页,套上那恶心的Smarty代码,然后在Dreamweaver里,你是否认真的看过那些页面已经变得何等的丑陋,图片还看得见吗?CSS还在吗?更不用说include了。而要修改的时候呢?你还能一眼认出来吗?
这些都解决不了,那些所谓的模板引擎又怎么配得上“强大”二字?
3....
多的我就不说了,这里只是拿Smarty举个例子,应该不难发现,其它模板引擎也大同小异,都忙着发明自己的模板语言,而真正需要解决的问题则避而不谈。
现在你是否明白了,所谓的模板引擎,所谓的强大,都TMD骗子。
在夜深人静的夜里,我曾无数次的醒来,感觉自己的担子又重了一些,只因为不能够将这个残忍的事实告诉你。
如果没有我这样人富有正义感又富有创新精神的热血青年站出来,不知道它还要继续毒害多少那些处于花季而又对PHP充满美丽幻想的少年。
1.语法
你真的认为美工学得了 {foreach key=key item=item from=$contact} 这样的语法
却学不了 <?php foreach ($contact as $key=>$item) { ?> 吗?
而 {if $name eq "Fred" or $name eq "Wilma"}
又比<?php if ($name=='Fred' or $name=='Wilma') { ?> 优秀到哪里去?
首先我对美工会学Smarty语法始终保持怀疑态度,至少我工作这么多年还没遇到过一个会Smarty语法的,而就算美工愿意学,你又为何不教他正宗的PHP语法,却要教他一门连你自己搞不清楚的“Smarty语言”。
2.可视化
当页面从美工交接到你手上,然后你给那些完美的网页,套上那恶心的Smarty代码,然后在Dreamweaver里,你是否认真的看过那些页面已经变得何等的丑陋,图片还看得见吗?CSS还在吗?更不用说include了。而要修改的时候呢?你还能一眼认出来吗?
这些都解决不了,那些所谓的模板引擎又怎么配得上“强大”二字?
3....
多的我就不说了,这里只是拿Smarty举个例子,应该不难发现,其它模板引擎也大同小异,都忙着发明自己的模板语言,而真正需要解决的问题则避而不谈。
现在你是否明白了,所谓的模板引擎,所谓的强大,都TMD骗子。
在夜深人静的夜里,我曾无数次的醒来,感觉自己的担子又重了一些,只因为不能够将这个残忍的事实告诉你。