欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

ThinkPHP3.1快速入门(9)变量输出

shiping1 的头像

在上一章我们了解了如何通过assign方法把变量赋值到模板变量,这一篇我们来详细了解下如何在模板中使用标签输出模板变量。
注意,本篇的描述仅针对使用内部模板引擎的情况,如果你使用了Smarty或者其他模板引擎,请参考其相关的变量输出语法。

变量输出

变量输出的方法很简单,例如,在控制器中我们给模板变量赋值:

  1. $name = 'ThinkPHP';

  2. $this->assign('name',$name);

  3. $this->display();

复制代码
 

然后就可以在模板中使用:

  1. Hello,{$name}!

复制代码
 

模板编译后的结果就是:

  1. Hello,<?php echo($name);?>!

复制代码
 

这样,运行的时候就会在模板中显示:

  1. Hello,ThinkPHP

复制代码
 

[-more-]
注意模板标签的{和$之间不能有任何的空格,否则标签无效。所以,下面的标签

  1. Hello,{ $name}!

复制代码
 

将不会正常输出name变量,而是直接保持不变输出:

  1. Hello,{ $name}!

复制代码
 

普通标签默认开始标记是 {,结束标记是 }。也可以通过设置TMPL_L_DELIM和TMPL_R_DELIM进行更改。例如,我们在项目配置文件中定义:

  1. 'TMPL_L_DELIM'=>'<{',

  2.  'TMPL_R_DELIM'=>'}>',

复制代码
 

那么,上面的变量输出标签就应该改成:

  1. Hello,<{$name}>!

复制代码
 

后面的内容我们都以默认的标签定义来说明。
模板标签的变量输出根据变量类型有所区别,刚才我们输出的是字符串变量,如果是数组变量,

  1. $data['name'] = 'ThinkPHP';

  2. $data['email'] = 'thinkphp@qq.com';

  3. $this->assign('data',$data);

复制代码
 

那么,在模板中我们可以用下面的方式输出:

  1. Name:{$data.name}

  2.  Email:{$data.email}

复制代码
 

或者用下面的方式也是有效:

  1. Name:{$data['name']}

  2.  Email:{$data['email']}

复制代码
 

当我们要输出多维数组的时候,往往要采用后面一种方式。
如果data变量是一个对象(并且包含有name和email两个属性),那么可以用下面的方式输出:

  1. Name:{$data:name}

  2.  Email:{$data:email}

复制代码
 

或者

  1. Name:{$data->name}

  2.  Email:{$data->email}

复制代码
 


系统变量

普通的模板变量需要首先赋值后才能在模板中输出,但是系统变量则不需要,可以直接在模板中输出,系统变量的输出通常以{$Think 打头,例如:

  1. {$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量

  2.  {$Think.session.user_id} // 输出$_SESSION['user_id']变量

  3.  {$Think.get.pageNumber} // 输出$_GET['pageNumber']变量

  4.  {$Think.cookie.name}  // 输出$_COOKIE['name']变量

复制代码
 

支持输出$_SERVER、$_ENV、 $_POST、 $_GET、 $_REQUEST、$_SESSION和 $_COOKIE变量。
还可以输出常量

  1. {$Think.const.MODULE_NAME}

复制代码
 

或者直接使用

  1. {$Think.MODULE_NAME}

复制代码
 

输出配置参数使用:

  1. {$Think.config.db_charset}

  2.  {$Think.config.url_model}

复制代码
 

输出语言变量可以使用:

  1. {$Think.lang.page_error}

  2.  {$Think.lang.var_error}

复制代码
 


使用函数

我们往往需要对模板输出变量使用函数,可以使用:

  1. {$data.name|md5} 

复制代码
 

编译后的结果是:

  1. <?php echo (md5($data['name'])); ?>

复制代码
 

如果函数有多个参数需要调用,则使用:

  1. {$create_time|date="y-m-d",###}

复制代码
 

表示date函数传入两个参数,每个参数用逗号分割,这里第一个参数是y-m-d,第二个参数是前面要输出的create_time变量,因为该变量是第二个参数,因此需要用###标识变量位置,编译后的结果是:

  1. <?php echo (date("y-m-d",$create_time)); ?>

复制代码
 

如果前面输出的变量在后面定义的函数的第一个参数,则可以直接使用:

  1. {$data.name|substr=0,3}

复制代码
 

表示输出

  1. <?php echo (substr($data['name'],0,3)); ?>

复制代码
 

虽然也可以使用:

  1. {$data.name|substr=###,0,3}

复制代码
 

但完全没用这个必要。

还可以支持多个函数过滤,多个函数之间用“|”分割即可,例如:

  1. {$name|md5|strtoupper|substr=0,3}

复制代码
 

编译后的结果是:

  1. <?php echo (substr(strtoupper(md5($name)),0,3)); ?>

复制代码
 

函数会按照从左到右的顺序依次调用。
如果你觉得这样写起来比较麻烦,也可以直接这样写:

  1. {:substr(strtoupper(md5($name)),0,3)}

复制代码
 


默认值

我们可以给变量输出提供默认值,例如:

  1. {$user.nickname|default="这家伙很懒,什么也没留下"}

复制代码
 

对系统变量依然可以支持默认值输出,例如:

  1. {$Think.get.name|default="名称为空"}

复制代码
 

默认值和函数可以同时使用,例如:

  1. {$Think.get.name|getName|default="名称为空"}

复制代码
 


使用运算符

我们可以对模板输出使用运算符,包括对“+”“ –” “*” “/”和“%”的支持。
例如:

运算符使用示例
+{$a+$b}
-{$a-$b}
*{$a*$b}
/{$a/$b}
%{$a%$b}
++{$a++} 或  {++$a}
--{$a--}  或 {--$a}
综合运算{$a+$b*10+$c}

在使用运算符的时候,不再支持点语法和常规的函数用法,例如:

  1. {$user.score+10} //错误的

  2.  {$user['score']+10} //正确的

  3.  {$user['score']*$user['level']} //正确的

  4.  {$user['score']|myFun*10} //错误的

  5.  {$user['score']+myFun($user['level'])} //正确的

复制代码
 


总结

通过本篇的学习,我们掌握了如何在模板文件中输出变量和使用函数、默认值和运算符,下一篇我们将会了解如何进行模板变量的循环、判断等控制输出,以及导入其他公共模板。

来自 
http://www.thinkphp.cn/info/154.html

QbuerQbuer01月18日
竟然改了Smarty的语法...有点不习惯
高飞01月15日
改变php的原生语法,这样输出不但让写的字符更多,还得用封装的函数去解析替换,凭白增加了执行过程。确实不高效!希望改进。
jack271508月07日
看来thinkphp做不到高效了
wlkwulikun2014年06月30日
记不住
ymenking2014年04月16日
破坏了php语法的规则,感觉这样输入并不好,一个框架,应该是在这种语法的基础上架设构建,而不该以破坏修改原生语法为基础
回复changup2014年08月21日
对对对,应该是基于框架思路而非基于语法;
wanzhende2014年04月09日
貌似如果使用类的数据成员,则就不用assign就可以直接输出了
回复iLoveProgram2014年04月14日
这里以stdClass内置对象为例:
$std=new StdClass();
$std->name="hao ren";
$std->status= 1;
//$this->assign('std',$std);不推荐使用,一般对象或者数组如下使用
//利用单参数的使用
$this->assign($std);
//当然这种写法跟$this->std=$std;也是等效的。
//记得要用display方法来渲染输出(模板页)
$this->display();
所以你说的只是对了一大半,不管是数组、还是变量,或者对象,都不用assign方法,也是可以传递的。
那么,设计者为什么还要设计这个assign方法呢?
1.安全性
2.可以隐式的赋值。
附上案例:
IndexAction.class.php
<?php
class IndexAction extends Action {
public function index(){
$var_array = array("color" => "blue",
"size" => "medium",
"shape" => "sphere");
$this->assign($var_array);
$this->display();
}
}
index.html
<html>
{$color} <!--这里输出blue-->
</html>
由上面的例子可以看出,框架是将参数数组中的每一个键值对当成“参数”=>“值”的形式赋值到模板里了
所以,如果需要赋值到模板上的值很多的话,不妨用这种方式
注意:
由于这是隐式地赋值,要注意参数重名哦!特别是id、name这一类数据库常用的字段。
回复zjj413103月29日
回复 iLoveProgram : 在吗?你QQ是多少,学习交流一下
、一汀烟雨2014年03月30日
哈哈,算是坚持下来了.继续挖掘中.
javcof2014年03月03日
ThinkPHP3.1快速入门(9)变量输出 Pass
wenyimimyw2014年02月10日
最后两句话说“下一篇我们将会了解如何进行模板变量的循环、判断等控制输出”,尼玛下一篇明明是讲缓存吧,然后翻到最后也没找到如何进行对变量循环判断等输出的讲解
wangd1112013年12月26日
特意注册来说两句,为毛,就是规则设计的太操蛋,原生代码不好么,搞一堆这么乱七八糟的东西。越用越复杂
tp849137402013年09月09日
研究研究
在路上就是传奇2013年08月24日
$this->assign('name2',$name)这里面的name2变量只能在所在方法所渲染的那个页面输出的么
回复Benayoun2013年12月09日
youareright
回复Benayoun2013年12月09日
youareright
回复Benayoun2013年12月09日
youareright
phantomshop2013年08月17日
Name:{$data->name}
Email:{$data->email}
这个输出不来嘛
回复qufo2014年01月06日
$data是对象就能输出,是数组就不行。
回复qianzhongxinxin04月10日
回复 qufo :数组输出方式 $data['name']
回复qufo2014年01月06日
$data是对象就能输出,是数组就不行。
回复qianzhongxinxin04月10日
回复 qufo :数组输出方式 $data['name']
回复qufo2014年01月06日
$data是对象就能输出,是数组就不行。
回复qianzhongxinxin04月10日
回复 qufo :数组输出方式 $data['name']
九日晴2013年08月07日
挺好的
gyzkobe2013年07月24日
另:模板中输出变量难道不支持逻辑判断、循环语句吗?if else foreach等等,文档中并无说明
回复See2013年07月24日
直接使用原生不就完了
回复See2013年07月24日
直接使用原生不就完了
回复See2013年07月24日
直接使用原生不就完了
gyzkobe2013年07月24日
  1. {$create_time|date="y-m-d",###}

复制代码
 
复制代码
 
复制代码
 
复制代码
 

完全没必要这么弄,规则愈发复杂,对使用者无任何益处。
回复uuaide2013年08月01日
是啊,简单问题复杂话。本来date("y-m-d",$create_time)就已经够简单了
回复uuaide2013年08月01日
是啊,简单问题复杂话。本来date("y-m-d",$create_time)就已经够简单了
回复uuaide2013年08月01日
是啊,简单问题复杂话。本来date("y-m-d",$create_time)就已经够简单了
混世小子2013年07月05日
知识在相互抄袭的过程中得到进化
zhangleiphp2013年06月26日
smarty
小网蚁2013年06月01日
用户手册是正道。
回复javcof2014年03月03日
赞+1
回复javcof2014年03月03日
赞+1
回复javcof2014年03月03日
赞+1
ewave2013年05月22日
请问使用的函数可以是自己定义 的函数 吗
回复大叔_pro2013年05月26日
可以的,不过要是能自动加载的函数才行,比如是封装在项目common目录下common.php里面的函数。
回复小小の2013年05月28日
谢谢大叔!
回复大叔_pro2013年05月26日
可以的,不过要是能自动加载的函数才行,比如是封装在项目common目录下common.php里面的函数。
回复小小の2013年05月28日
谢谢大叔!
回复大叔_pro2013年05月26日
可以的,不过要是能自动加载的函数才行,比如是封装在项目common目录下common.php里面的函数。
回复小小の2013年05月28日
谢谢大叔!
tp849137402013年09月09日
研究研究
在路上就是传奇2013年08月24日
$this->assign('name2',$name)这里面的name2变量只能在所在方法所渲染的那个页面输出的么
phantomshop2013年08月17日
Name:{$data->name}
Email:{$data->email}
这个输出不来嘛
九日晴2013年08月07日
挺好的
gyzkobe2013年07月24日
另:模板中输出变量难道不支持逻辑判断、循环语句吗?if else foreach等等,文档中并无说明
gyzkobe2013年07月24日
  1. {$create_time|date="y-m-d",###}

复制代码
 
复制代码
 
复制代码
 

完全没必要这么弄,规则愈发复杂,对使用者无任何益处。
混世小子2013年07月05日
知识在相互抄袭的过程中得到进化
zhangleiphp2013年06月26日
smarty
小网蚁2013年06月01日
用户手册是正道。
ewave2013年05月22日
请问使用的函数可以是自己定义 的函数 吗
easywang2013年03月11日
这个基本和smarty一样
回复yhhcbin2013年06月18日
同意,明显是抄袭smarty
回复wanghexinagqq2013年06月28日
回复 yhhcbin :
回复yhhcbin2014年04月12日
我错了,这不是抄袭smarty,连人家的皮毛都不如
lajitree2012年12月04日
还行吧、感觉学习thinkphp就是多看文档得
wszdw1422012年10月25日
很好理解!
tp849137402013年09月09日
研究研究
在路上就是传奇2013年08月24日
$this->assign('name2',$name)这里面的name2变量只能在所在方法所渲染的那个页面输出的么
phantomshop2013年08月17日
Name:{$data->name}
Email:{$data->email}
这个输出不来嘛
九日晴2013年08月07日
挺好的
gyzkobe2013年07月24日
另:模板中输出变量难道不支持逻辑判断、循环语句吗?if else foreach等等,文档中并无说明
gyzkobe2013年07月24日
  1. {$create_time|date="y-m-d",###}

复制代码
 

完全没必要这么弄,规则愈发复杂,对使用者无任何益处。
混世小子2013年07月05日
知识在相互抄袭的过程中得到进化
zhangleiphp2013年06月26日
smarty
小网蚁2013年06月01日
用户手册是正道。
ewave2013年05月22日
请问使用的函数可以是自己定义 的函数 吗


普通分类: