资源描述
PHP 本身就是一种标签语言,允许代码用标签的形式任意嵌套在 html 里,因此,我们可以用 PHP 自身的这种特性,完成 controller 与 view 的分离.1:Smarty 可以协助我们分离 PHP 与 html 代码,就是记 html 制作人员看不到 PHP 标签也可以对网站进行缓存2:面试是要用到3:体会模板的思想1:Cotroller 与 view 的分离是一种功能上的分离,是一种分工的思想.而 php 与 html 代码的分离,仅是代码层面或视觉层面上的分离.2:smarty 与 MVC 有什么关系?没关系.Smarty 完成的仅是代码分离.3:不用 smarty,仍然是能够完成 MVC 模式的开发Smarty 的一些负面思考:1:混杂在 HTML 代码中 smarty 标签和 PHP 代码.对于 web 前端开发人员来说,没有实质区别2:在实际开发中,html 模板-smarty 模板的制作,依然是由 PHPer 来完成的3:解析,编译本身消耗性能4:增多了很多变量,(页面内的变量,都要赋值到 smarty 对象-_tpl_vars 属性上,多了一个变量的副本)Smarty 模板类的工作流程1:引入 smarty 模板类2:assign 赋值,把外界变量传到对象内部(存在一个属性上)3:display(编译模板,把标签模板编译成 html+php 混杂的形式)4:运行编译后的模板Smarty 的引入Smarty 是一个类,引入过程与普通的类没有区别1:include,require 包含此文件2:实例化Smarty 的配置$template_dir=templates;/模板文件的所在目录$compile_dir=templates_c;/编译后的文件所在目录$config_dir=configs;/允许独立的配置文件存在,并且配置文件如果多了,允许单独放在一个目录里,$cache_dir=cache/代表缓存文件的存放目录plugins_dir=array(plugins,p2,p3);/插件目录(如果自行开发插件,可能会用到)left_delimiter=;/标签的左分界符Right_delimiter=/标签的右分界符Smarty 的赋值1:$smarty-assign(key,value);发生的变化$smarty-_tpl_varskey=value;2:如果 assign($arr$vluae)中的第一个参数是数组则会循环数组,把数组$arr中的$value 赋给$smarty 的标签$key3:append 追加赋值如果需要把多个值,赋给同一个标签变量,不必把多个值形成数组然后赋值,可以通过 append,往一个标签反复追加值.例:$smarty-append(goods,自行车);$smarty-append(goods,火车);此时:推论$smarty-_tpl_varsgoods=array(自行车,火车);如果append进去的值是数组,并且第3个merge参数为true,则会把数组单元逐个添加到goods数组里去.$smarty-append(goods,array(name=刘备,age=28),true);此时,$smarty-_tpl_varsgoods=array(自行车,火车,name=刘备,age=28);如果是$smarty-append(goods,array(name=刘备,age=28),false);此时,$smarty-_tpl_varsgoods=array(自行车,火车,array(name=刘备,age=28);Smarty 模板中,对变量的引用变量来源1:assign 赋值得到的变量2:$smarty 系统变量3:从配置文件读取的变量1.1 对于 assign 赋值得到的变量对于字符串型,数值型,直接通过$标签名 来引用1.2 对于数组变量如果键是字符串,则用$标签名.键如果键是数字,则用$标签名键1.3 对于对象方式用$标签名-属性名 来引用对象的属性值用$标签名-方法()来调用对象的方法的返回值2.1 smarty 中的系统变量以$smarty 开头例:$smarty.now,被 解析成 time();$smarty.get.key-$_GETkey$smarty.const.常量名-echo 常量名3.1 从配置文件得到的变量配置文件可以用来存储常用且很少变的数据,比如网站名,备案号通过配置文件得到这些信息,不必去读数据库,可以省一些数据库的开销.配置文件的写法;配置项 1=值 1配置项 2=值 2配置文件的载入Config_loadfile=xxx.conf配置文件中变量的引用$smarty.config.配置项或者#配置项#模板中的逻辑控制从 MVC 的角度看,在模板中加逻辑控制不正确的,但是,有时,不同的场景下,模板的差异非常小时,就比较适合在模板里加逻辑控制,可以减少模板的数量.If 控制结构if 表达式./ifIf else 控制结构if 表达式.else./ifIf elseif 控制结构if表达式.else if 表达式./ifSmarty 中的 foreach 控制结构要循环谁:某个数组 A当前循环的单元的键赋给哪个临时变量 B当前循环的单元的值赋给哪个临时变量 Cforeach from=$tag key=k ietm=c./foreach用 foreach 完成表格隔行换色功能$smarty-_foreach 属性,是一个数组如果 smarty 的 foreach 有 name 属性,设 name=abc则 smarty-_foreachabc=array(total=循环体个数,iteration=0);然后每循环一次,iteration 递增 1可以引用$smarty.foreach.foreahcname.key 的属性Key=total:循环个数Iteration:当前循环次数Index:当前索引,iteration-1First:判断是否是第 1 次循环Last:判断是否是最后一次循环注意:foreach 的 name 不能重复Smarty 中数学运算&比较运算&逻辑运算Smarty 比较运算符,=,),lt(=),eq(=),不一一列举,可以在 smarty_comilper.class.php 的 1330 行左右看到比较运算符的扩充情况.|&,or and标签中可以进行数学的+1*/%运算,但是注意,1:运算符两边不要有空格2:运算表达式应以标签开头Smarty 中的变量调节器例:$intro|upper,会把$info 的内容转换为大写原理:把$intro 作为参数,传给 upper 调节器对应的函数,并显示该函数值,而不是$intro$标签变量本身 会当成 调节器的第 1 个参数自动传入,如果需要传更多参数,在调节器后面,用:隔开更多参数.例$news|truncate:7:.常用变量调节器date_format 格式化日期default 默认值escape 编码indent 缩进lower 小写nl2br 换行符替换成 replace 替换strip 去除(多余空格)strip_tags 去除 html 标签upper 大写动手写一个变量调节器*:如何做到中文截取无乱码(常见的一道面试题)Display,fetch 的区别Display 是 ftech 方法第 4 个参数为 true 的调用.Fetch 第 4 个参数为 true,则把编译后文件的运行结果,输出!.为 false,则把编译后文件的运行,返回,不输出.即:display()=echo fetch();如何实现页面静态化?就是把.php 的输出内容,保存成 html但需要考虑以下细节:1:生成的静态页面的地址,例:253 新闻,如果是动态情况下,News.php?nid=253如果生成了静态页面 253.html不能直接放一个目录下,要按规律分目录,例如 年/月日/类别/253.html大批量生成静态页面,以织梦为例新闻表,有个字段标志:是否已生成静态页面,另个字段记录:生成后静态页面的地址生成列表页面或主页时,从新闻表取地址注意目录的深度:目录深不利于 SEO,浅的话,每个目录放的页面过多.Smarty 如何获取 PHP 编译文件要输出的内容答:利用输出缓冲来实现Ob_*系列函数今日狗咬人明天人咬狗12/0510/ecom/253.html缓存1:首选打开缓存配置项$smarty-caching=true;2:缓存生命周期的配置选项:$smarty-cache_lifetime=整数秒2:$smarty-is_cached()判断是否缓存,如果缓存,则避免 IO 操作局部缓存通过 hash 值,把局部不缓存的数组包围起来,用该 hash 值,把整个缓存文件 explode 拆成数组Arrray(html 代码不缓存内容,Html 代码不缓存内容)循环该数组,分析不缓存内容,把数组分析出来,读取数组的$arrname,该 name 就是不缓存内容,而且是待调用函数的名称.调用 insert_name(),把函数的返回值替换掉不缓存内容数组循环替换一遍之后,就把页面上所有不缓存的部分都替换成了函数的返回值,最后,再把数组 implode 拼接起来,就是最终的页面内容.单模板多缓存Display(模板名,缓存名);同一个模板名,如果不加缓存名,只能生成一个缓存文件.如果有缓存名,则会按 缓存名+模板名 生成缓存文件.如果同一个模板,提供不同的缓存名,则一个模板会产生多个缓存.同理,在判断某个模板是否已被缓存的时候,也需要注意,要传一个缓存名.即 is_cached(模板名,缓存名)才能合理判断.清除缓存清除缓存就把模板名+缓存名对应的缓存文件删除掉Clear_cache(模板名,缓存名);Clear_all_cache();Smarty 定界符冲突的解决如果 smarty 用定界符,比如,此定界在 js,css 里都有很可能碰到,如果碰到,会当成 smarty 标签来解析,进而引发错误发生.解决方法:1:换定界符,如 template_dir 目录来定位一:缓存按缓存位置分:文件缓存或者内存缓存1:文件缓存就是把数据以文件形式保存,这个过程,是消耗 IO 资源.2:页面缓存或者静态页面,缓存的是整体 html 代码,有大量的冗余的缓存.按缓存内容分:页面缓存和数据缓存3:真正应该缓存的是数据,而不是文件例如:1500W 条数据中,300W 条被频繁访问,可以把这 300W 条数据(不是静态页面),缓存到内存.甚至把 300W 条数据缓存到数据库4:images,js,css,等文件进行 前端缓存
展开阅读全文