99Game 模拟器研究 Ascent 's Archiver

艾森尼 发表于 2008-6-4 10:29

PHP实现MVC开发得最简单的方法——视图及模版技术

前天谈到MVC中的单点入口,今天我们主要谈谈MVC中的view(视图)。

     视图主要是把数据渲染现实给用户,其实就是把数据转化成THML输出给用户。在之前,我们一定都或多或少的了解过一些模版系统,比如说smarty,phplib,fasttemplate等等。模版系统不是完整意义上的视图,更加确切的说模版系统只是视图中的一个功能点。当然现在的模版系统的功能是越来越强大,比如说smarty实现了缓存的部分功能。

    关于模版系统的比较,大家可以看看这篇文章。模版系统原理其实很简单,就是把标签替换成相应的数据。但每个模版系统的实现方式都不完全一样,比如说smarty是编译型的,它第一个是把模版文件编译成相应的php文件,然后以后每次就直接调用编译后的文件,而PHPLIB是解析性的,每次都调用模版使用正则来替换。所以除了第一次smarty相对来说更加快。但是我不觉得使用标签有什么特别得好处。所谓得标签实现美工和程序分类,我认为是扯蛋。对于美工人员来说 {$var}和 有什么区别呢?

   在这里,我们做一个最简单的view类。
   首先,我们用函数实现一个最基本的渲染功能。

[code=php]
<?
function render($template,$vars)
{
    if(!file_exists($template))die($template.'不存在!');
    ob_start();
    if(is_array($vars)){
        foreach($vars as $key=>$value){
            $$key=$value;
        }
    }
    require $template;
    return ob_get_clean();
}
?>
[/code]
   如果你对ob_start不熟悉,请自己查阅手册。使用这个函数可以实现一个简单的view,比如说简单变量,数组,对象,模块化等等。
   下面是一个使用demo,只贴出最核心的使用例子,模版文件请下载demo。


[code=php]
<?
   function renderAction(){
        $t_path=SITE_PATH.'/app/views/';//设置模版文件的路径
         
        $array=array(
                'simple_var'=>'简单变量!',
                'array_var'=>array(
                            'array1'=>'变量1的值',
                            'array2'=>'变量2的值',
                            ),
                'file_template'=>render($t_path.'viewer2.php',array('var2'=>'文件2中的变量!'))                     
                );         
        echo render($t_path.'viewer.php',$array);
    }
?>
[/code]

   这里面用到了上一节的一些东西,不明白的请看《PHP实现MVC开发得最简单的方法——单点入口》
  实现后的效果图:
   

   最后提供一个类,实现类似zf的view的功能,关于它的使用,我就不多说了,很简单。


[code=php]
<?
/**
   *作者:feifengxlq
   *原文地址:[url=http://www.phpobject.net/blog/read.php/96.htm]http://www.phpobject.net/blog/read.php/96.htm[/url]  
   *时间:2007-1-12
*/
class viewer
{
     
    var $path;
    /**
      * 构造函数
    */
    function viewer($path='')
    {
       if(!empty($path))$this->set_tpl_path($path);
    }
    /**
      * 设置模版文件路径
    */
    function set_tpl_path($path)
    {
       if(!file_exists($path))$this->error(1,$path);
       $this->path=$path;
    }
    /**
      * 渲染视图
    */
    function render($template)
    {
       if(!file_exists($this->path.$template))$this->error(2,$this->path.$template);
       ob_start();
       require $this->path.$template;
       return ob_get_clean();
    }
     
    /*--------私有方法----------------------*/
    /**
      * 出错处理
    */
    function error($id,$other='')
    {
       switch($id)
       {
          case 1:
             $errormsg=$other.' 不是有效的文件路径!';
             break;
          case 2:
             $errormsg=$other.' 不是有效的模版文件!';
             break;
          default:
             break;      
       }
       die($errormsg);   
    }     
}
?>
[/code]

    提供整个demo文件下载。




转自: [url=http://www.phpobject.net/blog/read.php/96.htm]http://www.phpobject.net/blog/read.php/96.htm[/url]

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.