转一篇好文 痛斥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骗子。

  在夜深人静的夜里,我曾无数次的醒来,感觉自己的担子又重了一些,只因为不能够将这个残忍的事实告诉你。

你可能感兴趣的:(smarty)