先从smarty模板说起,众所周知如果用这个东东注册一个变量$smarty->assign($aaa,'123');
$smarty->display('a.tlp');
那么a页面就能使用$aaa这个变量呢,我想问的是。如果不用任何模板,我在a页面public一个变量,如何在b页面使用他?? 如果我用<?php $this->aaa;?>这样的方式,是否效率更高? 毕竟模板引擎也是用自己的语言逻辑实现这个过程。。
本人水平不高,想搞清楚这一点,求赐教

解决方案 »

  1.   

    用smarty赋值时,就是在smarty对象中创建了一个变量. 性能都差不多吧.
      

  2.   

    $smarty->assign($aaa,'123');
    $smarty->display('a.tlp');等价于
    $a = 234;
    ?>
    ...
    <?php echo $a ?>
      

  3.   

    在b页面直接使用 $this->a;
    1.继承a类型
    直接使用
    2.创建a类对象
    $a = new a();
    $a->a;
      

  4.   

    我就是不要使用任何模板。效率不见得高到哪去,我宁愿使用内嵌小脚本模式输出变量 如<?php foreach($this->data as $item)?>
      

  5.   

    唠叨哥。我这是在不同的页面,如a页面注册了变量,b页面引入a页面  然后如何使用$this->(a页面的变量)来访问它? 是否需要一个中央控制器来注册所有变量?
      

  6.   

    那不是一样吗?
    a.php
    <?php
    $a = 124;b.php
    <?php
    include 'a.php';
    ?>
    <p><?php echo $a ?></p>smarty与所有编译型模板引擎一样,都是在帮助你书写php+html的混合代码程序
    混合代码程序才是运行效率最高的
      

  7.   

    我給你一個function你看看或許對你有幫助/**
    通用範本處理引擎
    參數:
    調用範本並重組預定義的範本變量$Arr,讓每個key成為一個範本變量(key如果是數字將會被unset)
    說明:
    範本檔案名(多個名稱用*分隔),範本變量,是否直接輸出內容,範本路徑
    不直接返回的狀況主要用於返回編譯之後的範本內容,其目的是爲了緩存
    返回:
    如果直接顯示則沒有任何返回值,如果不直接顯示則返回編譯後的範本
    用法:
    //自定義範本變體:範本里調用時可用的變量為:$a;$b
    $out=Array('a'=>'abc',1=>'fff','b'=>Array('ee'=>'我','是')); //把前臺的兩個範本編譯之後直接輸出
    T('head*index',$out); //把前臺的範本編譯之後直接輸出
    T('test',$out,False); //把後臺範本編譯之後返回給調用對象
    T('test',$out,True,'adm');
    /**/
    Function T($Tpl,&$Arr=Array(),$IsShow=True,$Dir='usr') {
    IF($Tpl=='') {Return ;} Foreach($Arr as $k=>$v) {
    IF(Is_numeric($k)) {
    Unset($Arr[$k]);
    IF(SYS_DEBUG) {Error('FT0001',False);}
    Continue;
    }
    $$k=$v;
    }Unset($Arr); IF(!$IsShow) {//如果不允許直接輸出,則開啟緩衝抓取內容
    OB_start();OB_clean();
    } $Tpl=Str2Arr($Tpl,'*',True,True,False);
    Foreach($Tpl as $k=>$v){
    //範本檔案及路徑
    $FTpl=SYS_ROOT.$GLOBALS['SYS_TPL'.StrToUpper($Dir).''].$v.'.php'; //範本是否存在
    IF(!File_Exists($FTpl)) {Exit('Error:Template '.$FTpl);} //載入範本
    Require($FTpl);
    Unset($FTpl);
    }Unset($Tpl,$Dir); IF(!$IsShow) {
    $m=Ob_get_contents(); // 取得緩存區內容
    OB_end_clean(); // 清理原有內容OB_clean();
    OB_end_flush();
    Unset($IsShow);
    Return $m;
    }
    }
      

  8.   


    其實我現在的做法和你的想法是完全一樣的
    我的做法是把不常常更新的內容用樓上的函數處理并返回結果,把結果緩存到memcache,下次顯示的時候直接从memcache里取出来然后echo輸出,而常常更新的內容則用上邊的函數處理變量,在模板里嵌套<?php ?>代碼塊.
    我曾在linux上做過一個比較全面的壓力測試,發現在同時并发数达到10000的情况下,速度还是非常快.所以一直以来我一直沿用此方式,而没有使用smarty.
      

  9.   

    我以前写.NET的时候就是一直内嵌小脚本。现在写PHP了,主要是想了解下后台注册变量前台显示的这个原理是什么。我非常想知道后台定义变量。前台如何通过$this->变量名来访问它? 了解的人请赐教
      

  10.   

    就是在处理输出的时候大致使用这种方法
    foreach($this->assigns as $key => $value) {
     $$key = $value;
    }
    include('template.tpl');
      

  11.   

    还是遵守smarty的模板原理吧。
      

  12.   

    大家都不习惯用ini或者session吗?嫌太慢了?
      

  13.   

    $smarty->assign
    主要做的就是将变量注册到smarty自己的数组里面
    在display(".tpl")的时候将模板标签用正则替换成php的服务器标签,include那个页面之后就能使用你注册的变量了
    如果每次访问都是需要这样的执行步骤的话用模板确实没有直接用服务器标签来的快
    但是smarty中有完备的缓存机制,他第二次访问就会直接访问你第一次访问编译后的php标签的页面,即有混合代码的文件,效率已经和纯Php无差了,而且长还可以开启caching缓存功能直接生成html代码的页面,这样的统一调度下效率更快,而且模板机制  数据和逻辑分离,换ui也很简单
    所以 我觉得模板还是很不错的