`

转一篇好文 痛斥smarty

 
阅读更多

我赞同作者对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骗子。

  在夜深人静的夜里,我曾无数次的醒来,感觉自己的担子又重了一些,只因为不能够将这个残忍的事实告诉你。
分享到:
评论
1 楼 vb2005xu 2012-04-25  
http://c.t.qq.com/i/40?pn=10&lid=3852110452959&p=11&top=1

相关推荐

    smarty3中文手册

    这个"smarty3中文手册"是针对Smarty3框架的详细文档,提供了全面的指南、教程和API参考,帮助开发者更好地理解和使用该模板引擎。 Smarty3的主要特性包括: 1. **模板和PHP分离**:Smarty3通过使用特殊的语法,如`...

    smarty完全中文手册

    这个“Smarty完全中文手册”是一个详尽的资源,旨在帮助用户深入理解和有效利用Smarty框架。 Smarty的核心概念在于其模板系统,它允许设计师使用简单的HTML语法来创建页面布局,然后通过变量和控制结构将动态数据...

    Smarty+smarty中文手册

    Smarty的核心理念是"分离视图(模板)和控制器(逻辑)",这是一种常见的MVC(Model-View-Controller)设计模式的应用。 Smarty-2.6.18.tar.gz 是Smarty的一个特定版本,即2.6.18版的源码压缩包。.tar.gz格式是一种...

    php smarty3.0+Smarty中文手册chm

    这篇文档将详细介绍Smarty3.0的关键概念和功能。 1. **Smarty模板引擎基础** Smarty的核心理念是让HTML模板和PHP代码分离,通过变量赋值和控制结构来实现动态内容渲染。在Smarty3.0中,你可以定义模板文件,其中...

    SMARTY中文模板手册

    #### 一、Smarty简介 - **定义**:Smarty是一种用PHP编写的模板引擎,其核心理念在于实现逻辑与外观的分离,从而让前端设计师与后端开发者能够独立工作,减少开发周期,提高效率。 - **应用场景**:适合大型项目或...

    Smarty 3 中文手册

    Smarty是一个流行的、强大的、可扩展的模板引擎,它将应用程序的逻辑与表现层分离,使设计师和程序员能够更有效地协作。手册详细介绍了如何使用Smarty来构建高效的Web应用,并提供了丰富的示例和解释。 Smarty ...

    Smarty3 中文手册

    Smarty3 中文手册是这个模板引擎的官方文档的中文版本,对于学习和使用Smarty3的中文用户来说,是一份极其重要的参考资料。 Smarty3 的核心理念在于提供一种方式,让程序员编写PHP代码,而设计师可以使用HTML和简单...

    smarty模板中文手册

    3. 缓存技术:Smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,当设定Smarty的cache属性为true时,在Smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来...

    Smarty完全中文手册

    Smarty是一款广泛应用于PHP开发中的模板引擎,它的设计目标是将表现层(HTML)与业务逻辑层(PHP)分离,使得开发者可以更专注于后端逻辑,而设计师则可以自由地使用HTML来设计页面,无需关心PHP代码。这个"Smarty...

    smarty中文及英文手册

    Smarty是一个流行的PHP模板引擎,它的出现使得Web开发者可以将HTML设计和PHP代码分离,从而让网站的维护和更新变得更加高效和便捷。这个压缩包包含了三本关于Smarty的详细手册,分别是Smarty完全中文手册、smarty_...

    smarty truncate中文乱码解决

    Smarty是一款广泛使用的PHP模板引擎,它允许开发者将HTML和PHP代码分离,使网站设计与后端编程更加清晰、独立。在使用Smarty时,有时我们可能会遇到“truncate”修饰符处理中文字符串时出现乱码的问题。这通常是由于...

    smarty中文手册

    为了更好地学习和使用Smarty,你可以参考压缩包中的"smarty中文手册.chm"文件。这个手册详细介绍了Smarty的安装、配置、基本用法以及高级特性。同时,"脚本之家下载说明_jb51.net.txt"可能包含了一些关于如何在脚本...

    smarty中文使用手册

    本手册是Smarty的中文使用指南,旨在帮助中文用户更好地理解和应用Smarty框架。 1. **Smarty简介** Smarty是一个基于PHP的模板系统,它引入了MVC(Model-View-Controller)设计模式,允许开发者将PHP代码和HTML...

    smarty中文说明

    就是smarty介绍

    smarty中文手册api

    此外,Smarty还提供了一系列内置函数,如`{function name=arg1 arg2}`,用于格式化数据、处理字符串、操作数组等。 3. **模板继承**:通过使用`{extends}`指令,一个模板可以继承另一个模板的基础结构,只覆盖特定...

    smarty中文手册 双语版

    Smarty是一个流行的PHP模板引擎,它的设计目标是将HTML模板与PHP代码分离,使得网页设计师可以专注于页面布局,而程序员则可以处理业务逻辑和数据处理。这个"Smarty中文手册 双语版"为开发者提供了详尽的参考信息,...

    smarty中文开发手册

    Smarty是一个流行的PHP模板引擎,它的主要目标是将呈现逻辑与应用程序的业务逻辑分离,从而让开发者专注于编写PHP代码,而设计师则可以独立地工作在HTML模板上。这个"Smarty中文开发手册"是针对PHP开发者的一份重要...

    Smarty中文手册,Smarty教程,Smarty模板的入门教材

    ### Smarty中文手册与教程知识点详解 #### 一、Smarty简介 **Smarty** 是一款用于 PHP 的模板引擎,...通过本文介绍的知识点,希望能够帮助读者更好地理解和掌握 Smarty 的使用方法,为自己的项目带来更多的可能性。

    Smarty完全中文手册 CHM

    Smarty是一款广泛应用于PHP开发中的模板引擎,它将呈现逻辑与业务逻辑分离,使得网页设计人员和程序员能够更好地协同工作。这个“Smarty完全中文手册 CHM”是一个帮助文档,旨在为PHP开发者提供关于Smarty的详尽指导...

Global site tag (gtag.js) - Google Analytics