PHP自己就是一種標籤語言, <?php echo $title; ?>php
容許代碼用標籤的形式任意嵌套在html裏,css
所以,咱們能夠用PHP自身的這種特性,完成controller與view的分離.html
1:Smarty能夠協助咱們分離PHP與html代碼, 就是記html製做人員看不到PHP標籤前端
2:也能夠對網站進行緩存(重要)web
3:面試是要用到面試
4:體會模板的思想數據庫
1:Cotroller與view的分離是一種功能上的分離,是一種分工的思想.數組
而php與html代碼的分離,僅是代碼層面或視覺層面上的分離.緩存
2:smarty與MVC有什麼關係?cookie
不要緊.
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 = '}' // 標籤的右分界符
Caching = 0/1/2 // 是否開啓緩存
cache_lifetime = 3600 秒 // 緩存生命週期
Smarty的賦值
1: $smarty->assign('key',value);
發生的變化$smarty->_tpl_vars[key] = value;
2: 若是assign($arr)中的第一個參數是數組
則會循環數組,把數組的每個單元追加到_tpl_vars屬性上
3:append追加賦值
若是須要把多個值,賦給同一個標籤變量, 沒必要把多個值造成數組而後賦值,
能夠經過append,往一個標籤反覆追加值.
例:
$smarty->append('goods','自行車');
$smarty->append('goods','火車');
此時: 推論 $smarty->_tpl_vars['goods'] = array(自行車,火車);
若是append進去的值是數組,而且第3個merge參數爲true,則會把數組單元逐個添加到goods數組裏去.
$smarty->append('goods',array('name'=>'劉備','age'=>28),true);
此時, $smarty->_tpl_vars['goods'] = array(自行車,火車,'name'=>'劉備','age'=>28);
若是是$smarty->append('goods',array('name'=>'劉備','age'=>28),false);
此時, $smarty->_tpl_vars['goods'] = array(自行車,火車,array('name'=>'劉備','age'=>28));
Smarty模板中,對變量的引用
變量來源
1:assign賦值獲得的變量 , 存儲在_tpl_vars屬性中
2:$smarty系統變量, 對於cookie,session,get,post,$_SERVER等信息,存儲在_smarty屬性中
Smarty會自動捕捉,並保存起來,造成系統變量,能夠直接用標籤來引用.
3:從配置文件讀取的變量 , 存儲在_config屬性中
1.1 對於assign賦值獲得的變量
對於字符串型,數值型, 直接經過 $標籤名 來引用
1.2 對於數組變量
若是鍵是字符串,則用$標籤名.鍵
若是鍵是數字, 則用 $標籤名[鍵]
1.3 對於對象方式
用$標籤名->屬性名 來引用對象的屬性值
用$標籤名->方法() 來調用對象的方法的返回值
2.1 smarty中的系統變量
以$smarty開頭
例: $smarty.now, 被 解析成 time();
$smarty.get.key ---> $_GET[key]
$smarty.const.常量名 ---> echo 常量名
3.1 從配置文件獲得的變量
配置文件能夠用來存儲經常使用且不多變的數據,好比網站名,備案號
經過配置文件獲得這些信息,沒必要去讀數據庫,能夠省一些數據庫的開銷.
配置文件的寫法;
配置項1=值1
配置項2=值2
配置文件的載入
Config_load file="xxx.conf"
配置文件中變量的引用
$smarty.config.配置項
或者 #配置項#
模板中的邏輯控制
從MVC的角度看,在模板中加邏輯控制不正確的,
可是, 有時,不一樣的場景下,模板的差別很是小時, 就比較適合在模板里加邏輯控制,
能夠減小模板的數量.
If控制結構
{if 表達式}
....
....
{/if}
If else 控制結構
{if 表達式}
...
....
{else}
....
....
{/if}
If elseif 控制結構
{if 表達式}
...
...
{else if 表達式}
...
...
{/if}
Smarty中的foreach控制結構
要循環誰: 某個數組 A
當前循環的單元的鍵賦給哪一個臨時變量 B
當前循環的單元的值賦給哪一個臨時變量 C
{foreach from=$tag key=k ietm=c}
.....
.....
....
{/foreach}
用foreach完成表格隔行換色功能
$smarty->_foreach 屬性, 是一個數組
若是smarty的foreach有name屬性, 設name="abc"
則smarty->_foreach['abc'] = array(total=>循環體個數,iteration=0);
而後每循環一次,iteration 遞增1
能夠引用$smarty.foreach.foreahcname.key的屬性
Key =
total : 循環個數
Iteration: 當前循環次數
Index : 當前索引, iteration-1
First: 判斷是不是第1次循環
Last: 判斷是不是最後一次循環
注意:foreach的name不能重複
Foreach中的key=k, item=v
會影響到同名的標籤,請注意,標籤不要和foreach中的標籤同名.
Smarty中數學運算 &比較運算 & 邏輯運算
Smarty比較運算符
>,<,>=,<=,!=,==,和PHP中同樣.
Smarty對比較運算符作了一個擴充
如 gt(>),lt(<), gte(>=), 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 [換行符替換成 <br />]
replace [替換]
strip [去除(多餘空格)]
strip_tags [去除html標籤]
upper [大寫]
動手寫一個變量調節器
*:如何作到中文截取無亂碼(常見的一道面試題)
Smarty模板編譯的特色
Phplib也是一種模板引擎
Smarty的一個特色: 先編譯成.php文件,再執行該 PHP
Phplib是把變量直接替換模板中的標籤.
Smarty在第一次運行的時候,稍慢 ,包含了 編譯模板+包含執行
後面的運行中速度會快,由於直接包含PHP文件.
問: smarty什麼時間從新編譯模板?
答: 根據模板修改的時候.
若是想強制編譯: 好比在開發過程當中
能夠force_compile=true 強制編譯
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_*系列函數
緩存
1:首選打開緩存配置項 $smarty->caching = true;
2:緩存生命週期的配置選項: $smarty->cache_lifetime = 整數秒
3:$smarty->is_cached()判斷是否緩存,若是緩存,則避免IO操做
單模板多緩存
1個模板還能夠根據其餘參數,緩存多個結果,好比商品頁面根據商品id來爲每一個商品緩存一個頁面.
原則: 凡是可以影響到頁面內容的參數,就要根據此參數影響cached_id
這樣,不一樣參數才能對應不一樣的緩存內容.
用法:
Display(模板名[,緩存名]);
同一個模板名,若是不加緩存名,只能生成一個緩存文件.
若是有緩存名,則會按 緩存名+模板名 生成緩存文件.
若是同一個模板,提供不一樣的緩存名,
則一個模板會產生多個緩存.
同理, 在判斷某個模板是否已被緩存的時候,也須要注意,
要傳一個緩存名.
即 is_cached(模板名,緩存名) 才能合理判斷.
緩存判斷原理
當前時間 - 緩存生成時間 > 生命週期
局部緩存
在模板中,不須要緩存的地方,用{insert name="nocachedid"}來表示, 那麼該處最終的值是 insert_nocachedid()的返回值
經過hash值,把"局部不緩存"的數組包圍起來,
用該hash值,把整個緩存文件 explode拆成數組
Arrray(
'html代碼'
不緩存內容,
Html代碼
不緩存內容
)
循環該數組, 分析"不緩存內容",把數組分析出來,讀取數組的$arr['name'],
該name就是不緩存內容,並且是待調用函數的名稱.
調用 insert_name(), 把函數的返回值替換掉"不緩存內容"
數組循環替換一遍以後,就把頁面上全部不緩存的部分都替換成了函數的返回值,
最後,
再把數組implode拼接起來,就是最終的頁面內容.
清除緩存
清除緩存就把"模板名+緩存名"對應的緩存文件刪除掉
Clear_cache(模板名[,緩存名]);
Clear_all_cache();
Smarty定界符衝突的解決
若是smarty用定界符,好比 {,},
此定界在js,css裏都有極可能碰到,若是碰到,會當成smarty標籤來解析,進而引起錯誤發生.
解決方法:
1:換定界符,如 {> <}
2:用literal標籤,"原義","字符意義的","無誇張的"
模板的包含
用include標籤來包含
具體語法 {include file="xxx.html"}
注意,也能夠有多級目錄來放置模板, 若是有多級目錄,
以哪個目錄來定位?
答:以$smarty->template_dir目錄來定位
一:緩存
按緩存位置分:文件緩存或者內存緩存
1:文件緩存就是把數據以文件形式保存,
這個過程,是消耗IO資源.
2:頁面緩存或者靜態頁面 ,緩存的是總體html代碼,有大量的冗餘的緩存.
按緩存內容分: 頁面緩存和數據緩存
3:真正應該緩存的是數據,而不是文件
例如:1500W條數據中,300W條被頻繁訪問,
能夠把這300W條數據(不是靜態頁面 ),緩存到內存.
甚至把300W條數據緩存到數據庫'
4:p_w_picpaths,js,css,等文件進行 前端緩存