配置文件分3類:系統配置文件,分組配置文件,應用配置文件
①系統配置文件ThinkPHP/Conf/convention.php;
②分組 / 模塊 /平台配置文件Home/Conf/config.php;
③應用配置文件Common/Conf/config.php;
(1)什么是視圖?
MVC中的V(view),主要負責信息的輸出展示
(2)視圖的創建?
創建位置:分組目錄Home下的View目錄下指定的控制器名目錄中,然后將模板綁定到控制器的方法中,一個公共控制器中可以綁定多個模板
注意:位置問題,控制器同名
①位置是view下與控制器同名的目錄中;view下一級目錄為控制器,二級目錄為方法(對應的模板文件)
②如果有多個模板文件,則按照上面要求進行創建
(3)視圖的展示?
在smarty中展示模板用的display方法,在ThinkPHP里同樣是display方法
display在ThinkPHP中的3種語法格式:
①$this->display(); 展示當前控制器下與當前請求方法名一致的模板文件
②$this->display(模板文件名--不帶后綴); 展示當前控制器下指定模板文件
③$this->display(view目錄下目錄名/模板文件名--不帶后綴); 展示指定控制器下的指定模板文件
案例:
<?php namespace Admin\controller; use Think\Controller; class TestController extends Controller{ public function test1(){ $this->display('Person/person');//顯示Person下person.html模板 } } ?>
(4)變量分配
將變量從控制器的方法里傳遞到模板中展示的過程即為變量分配
在ThinkPHP中系統封裝好了一個變量的分配方法,在smarty中用assign,在ThinkPHP里也是assign(分配)
語法:$this->assign('模板中變量名',$php中的變量名);
<?php namespace Admin\controller; use Think\Controller; class TestController extends Controller{ public function test1(){ //不寫date()的第二個參數,則默認為當前時間 $time = date('Y-m-d h:i:s',time()); $this->assign('time',$time);//變量的傳遞,接下來是模板文件數據展示 $this->display(); } } ?>
接下來是數據的展示
在smarty里展示變量,寫在標記里{!-- --}。在ThinkPHP里,默認的展示變量方法與smarty類似,{$模板中變量名}
<!DOCTYPE html> <html> <head> <title>test1</title> </head> <body> <p> 現在時間是:{$time} </p> </body> </html>
注意:①模板展示放在變量分配后,否則無法展示變量;②一般情況下兩個參數的變量名是一樣的,方便查找
(5)變量分隔符
ThinkPHP默認變量分隔符為{},可以在配置文件ThinkPHP/Conf/convertion.php里找到配置項
// 布局設置 'TMPL_L_DELIM' => '{', // 模板引擎普通標簽開始標記 'TMPL_R_DELIM' => '}', // 模板引擎普通標簽結束標記
左右標記可以通過配置項修改,例如將左標記符改為],則在模板里的變量需要改為[$time}
(6)模板常量替換機制
①由來:實際開發中,在引入css、js、圖片等文件時,往往需要些一些復雜的路徑。這時可以考慮用模板常量替換機制,將復雜路徑簡單化
②ThinkPHP里系統默認提供了一下幾個常用的模板常量(因為是模板常量,所以只能在模板中使用,不能在控制器里使用)
__MODULE__:(模塊/組件),輸出到分組,表示從域名后開始到分組名結束的路由。/index.php/Admin
__CONTROLLER__:(控制),輸出到控制器,/index.php/Admin/Test
__ACTION__:(方法),輸出到方法,/index.php/Admin/Test/test1
__PUBLIC__:表示從域名后開始找,站點根目錄下Public目錄路由,/public
__SELF__:當前路由,從域名后開始到路由結束,與__ACTION__區別:/index.php/Admin/Test/test1/id=10,具體輸出不同。當沒有參數時,__SELF__和__ACTION__相同
③模板常量來源?
這里模板常量是通過模板內容替換機制來實現的,並非是常量的定義。所以模板常量並非是常量,而是字符串。
替換機制可以查看行為文件ThinkPHP/Library/Behavior/ContentReplace.Behaviour.class.php
拓展:查看后即可得出行為文件命名,文件名.Behaviour.class.php。
/** * 模板內容替換 * @access protected * @param string $content 模板內容 * @return string */ protected function templateContentReplace($content) { // 系統默認的特殊變量替換 $replace = array( '__ROOT__' => __ROOT__, // 當前網站地址 '__APP__' => __APP__, // 當前應用地址 '__MODULE__' => __MODULE__, '__ACTION__' => __ACTION__, // 當前操作地址 '__SELF__' => htmlentities(__SELF__), // 當前頁面地址 '__CONTROLLER__'=> __CONTROLLER__, '__URL__' => __CONTROLLER__, '__PUBLIC__' => __ROOT__.'/Public',// 站點公共目錄 ); // 允許用戶自定義模板的字符串替換注意:行為文件是系統自帶的,一般不建議去改動 if(is_array(C('TMPL_PARSE_STRING')) ) $replace = array_merge($replace,C('TMPL_PARSE_STRING')); $content = str_replace(array_keys($replace),array_values($replace),$content);//這步便是通過模板內容替換機制str_replace return $content;
其模板常量的核心就是字符串的替換str_replace
④自定義模板常量
為了后期使用方便,可以在配置文件里定義一個自定義的模板常量
配置項為TMPL_PARSE_STRING
注意:開發時盡量不要修改系統配置文件,因為系統配置文件的作用范圍十分廣泛。可以將需要修改的配置項,在分組、應用級別的配置文件里去定義,不要直接在系統文件里修改。
例如:放到應用配置文件Common/Conf/config.php
<?php return array( //'配置項'=>'配置值' //模板常量 'TMPL_PARSE_STRING' => array( // __ROOT__.'/Public'站點公共目錄,即根目錄下public '__ADMIN__' => __ROOT__.'/Public/Admin', //定義好之后,可以通過__ADMIN__來訪問靜態資源路徑 ) );
驗證:模板輸入__ADMIN__來驗證,輸出結果為/Public/Admin,表示驗證成功
(5)獲取模板內容
在ThinkPHP里有一個方法與display展示模板方法類似,叫做fetch()方法
$this->display();用來展示模板內容,而$this->fetch常用來獲取模板內容
語法:$this->fetch();
作用:獲取模板內容,返回字符串(字節長度)
//模板常量的獲取 $str = $this->fetch();
echo '<pre>'; var_dump($str);
echo '</pre>';
注意:在ThinkPHP中封裝好了一個友好的打印方法--dump()方法。語法格式:dump(需要打印的變量)
所以上訴打印語法可以換為
dump($str);
該語法封裝在系統的函數庫ThinkPHP/Common/functions.php里
/** * 瀏覽器友好的變量輸出 * @param mixed $var 變量 * @param boolean $echo 是否輸出 默認為True 如果為false 則返回輸出字符串 * @param string $label 標簽 默認為空 * @param boolean $strict 是否嚴謹 默認為true * @return void|string */ function dump($var, $echo=true, $label=null, $strict=true) { $label = ($label === null) ? '' : rtrim($label) . ' '; if (!$strict) { if (ini_get('html_errors')) { $output = print_r($var, true); $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>'; } else { $output = $label . print_r($var, true); } } else { ob_start(); var_dump($var); $output = ob_get_clean(); if (!extension_loaded('xdebug')) { $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output); $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>'; } } if ($echo) { echo($output); return null; }else return $output; }
(6)display()方法與fetch()方法對比:
display():替換模板中常量/變量→獲取模板內容→輸出模板內容
fetch():替換模板中常量/變量→獲取模板內容
對比即可發現fetch()方法相對於display()方法只是缺少了輸出模板的步驟
所以我們可以對上訴代碼進行修改,手動添加輸出echo()步驟,輸出獲取的內容即可產生和display()展示模板信息同樣的效果
//模板常量的獲取 $str = $this->fetch(); //模板內容的輸出---產生類似於display()的效果 echo($str);
下面來看下底層實現的步驟:
①由當前控制出發開始分析,display()繼承自父類控制器Controller.class.php
class TestController extends Controller{ public function test1(){ //模板常量的展示 $this->display(); //模板常量的獲取 $str = $this->fetch(); echo($str); } }
②分析父類控制器ThinkPHP/Library/Think/Controller.class.php,display來源於實例化Think/View
/** * 架構函數 取得模板對象實例 * @access public */ public function __construct() { Hook::listen('action_begin',$this->config); //實例化視圖類 $this->view = Think::instance('Think\View'); //控制器初始化 if(method_exists($this,'_initialize')) $this->_initialize(); } /** * 模板顯示 調用內置的模板引擎顯示方法 */ protected function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') { $this->view->display($templateFile,$charset,$contentType,$content,$prefix); }
③Think/View.class.php,這里的display()便是我們底層最終執行的display()
/** * 加載模板和頁面輸出 可以返回輸出內容 * @access public * @param string $templateFile 模板文件名 * @param string $charset 模板輸出字符集 * @param string $contentType 輸出類型 * @param string $content 模板輸出內容 * @param string $prefix 模板緩存前綴 * @return mixed */ public function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') { G('viewStartTime'); // 視圖開始標簽 Hook::listen('view_begin',$templateFile); // 解析並獲取模板內容 $content = $this->fetch($templateFile,$content,$prefix); // 輸出模板內容 $this->render($content,$charset,$contentType); // 視圖結束標簽 Hook::listen('view_end'); }
綜上,分析底層代碼即可得出display()方法的前兩部,實際上是通過fetch()方法實現的
(7)視圖注釋
回顧下HTML的注釋<!--注釋內容-->,普通的注釋在頁面源碼中會被輸出
在thinkPHP中的注釋不會被輸出
模板視圖中變量的注釋
行注釋------{//注釋內容} 塊注釋------{/*注釋內容*/}
注釋作用:提供代碼可讀性,方便日后項目的維護
注意:①不論行注釋還是塊注釋,在注釋里不要再加入模板變量,否則會被自動解析出來,影響注釋,導致注釋失敗。例如:
<body> {/*我是注釋{$number}*/} <!--會被瀏覽器解析成 {/*我是注釋{$number}*/} --> </body>
②行注釋不要跨行
拓展:
經典面試題:ThinkPHP中的行注釋和塊注釋,與HTML里的注釋有什么區別?
HTML中的注釋屬於客戶端的注釋,會在瀏覽器的源代碼被輸出,而ThinkPHP里的注釋屬於服務器端的注釋,不會被輸出
(8)變量分配
變量輸出:簡單變量,一維數組,二維數組,對象變量
變量的分配語法相同:都是assign('模板中的變量',PHP中的變量);
①簡單變量輸出
上面已經總結過了,將變量從控制器的方法里傳遞到模板中展示的過程即為變量分配。在ThinkPHP中系統封裝好了一個變量的分配方法,在smarty中用assign,在ThinkPHP里也
是assign(分配)
語法:$this->assign('模板中變量名',$php中的變量名);
②一維數組輸出
//定義一維數組 $array = array('123','456','789'); //變量的分配 $this->assign('array',$array);
在PHP里數組輸出具體元素可以通過下標形式輸出:$array[key]
在模板中也可以通過下標形式輸出數組中的數據:{$array[key]},除此外還有其他形式,下面列舉出來
中括號形式:{$array[key]}
點形式:{$array.key}
總結:兩種形式都可以使用,沒有什么區別
③二維數組輸出
//定義二維數組 $array = array( array('one','two','three'),array('four','five','six') ); //變量的分配 $this->assign('array',$array);
模板中展示數組數據,可以通過下標、中括號形式輸出
④對象變量輸出
對象在實例化之后,會保存到變量中,而這個變量也可以分配到模板里去
首先創建類,然后實例化類來創建對象
注意:
1. 對於多個人開發項目,函數名很容易重復。用了類之后,類之間的方法名被類分開,重名也沒關系。
但是當項目更大時,類名也有可能重復。此時就要用到命名空間,來避免重名。所以創建類之前必須定義命名空間
2. 創建類文件時,必須加上文件名.class.php
Student.class.php
<?php //命名空間,命名空間的寫法取決於文件存放的位置。因為要放到控制器目錄Admin\Controller里,所以命名空間為Admin\Controller namespace Admin\Controller; class Student{ } ?>
TestController.class.php,該文件里不用引入,直接實例化類,輸出
object(Admin\Controller\Student)#6 (0) {
}
TestController.class.php:
<?php namespace Admin\Controller; use Think\Controller; class TestController extends Controller{ public function test1(){ //實例化Student對象 $stu = new Student(); dump($stu); } } ?> <meta charset="utf-8">//這里為了方便,直接去入口文件添加header頭,設置編碼字符集,我在下面拓展里做介紹
類的實例化:
1. 之所以不用引入類就能實例化,主要因為命名空間
命名空間運行流程:當需要引入或使用元素時,默認先去當前空間下去找。而Student.class.php在當前空間下Admin\Controller,所以會找到執行。若找不到則會報錯
2. 如果不寫命名空間、include、require則會默認從當前空間下去查找需要的元素,若找不到則報錯
拓展:設置編碼字符集:
index.php入口文件: //給入口文件添加header頭聲明字符集 header('Content-Type:text/html;charset=utf-8')
接下來給類的屬性賦值,並在方法中打印對象
//給類的屬性賦值 $stu -> id='1'; $stu -> name='Tony的名字'; $stu -> age='23'; dump($stu);
輸出結果為:
object(Admin\Controller\Student)#6 (3) {
["id"] => string(1) "1"
["name"] => string(13) "Tony的名字"
["age"] => string(2) "23"
}
之后將變量分配到目標中展示→首先創建模板,模板名與方法名一致;創建好之后輸出對象
回顧PHP輸出對象屬性: ①$obj->attr;②$obj::attr;兩種方式輸出對象屬性。推薦使用第一種
ThinkPHP里輸出屬性值有兩種方式:①$obj->attr;②$obj : attr;
所以ThinkPHP模板中輸出變量可以用{$obj->attr}或者{$obj : attr}
注意:在ThinkPHP模板中,在輸出對象屬性時,不要使用.形式。因為不允許將對象作為數組使用,會報錯
Cannot use object of type Admin\Controller\Student as array 翻譯為:不能使用Admin \ Controller \ Student類型的對象作為數組
錯誤位置 錯誤位置:Runtime臨時文件下的65af6f45e2487d64435139e4da34a722.php即為該文件運行的臨時目錄,臨時文件名通過md5加密
FILE: C:\site\Application\Runtime\Cache\Admin\65af6f45e2487d64435139e4da34a722.php LINE: 10
(9)系統變量
ThinkPHP里提供了以下幾個系統級別的變量(可以理解為超全局變量在模板中的使用)
$Think.server;$Think.get;$Think.post;$Think.request;$Think.cookie;$Think.session;$Think.config;
下面依次介紹
$Think.server == $_SERVER獲取服務器的相關信息,大約80個元素
$Think.get == $_GET獲取get請求的信息
$Think.post == $_POST獲取post請求的信息
$Think.request == $_REQUEST獲取get和post中的信息,就是get和post的集合
$Think.cookie == $_COOKIE獲取cookie信息
$Think.session == $_SESSION獲取session信息
簡單總結下就會發現:以上都是獲取類型的變量,因為這些系統變量是用在模板中的。而目標里只能獲取,不能設置
$Think.config為ThinkPHP封裝的。表示獲取ThinkPHP中所有配置文件的總和,如果后面指定了元素,則獲取指定配置
上述7個常用系統變量語法格式相同,即{$Think.xxx.具體元素下標}。例如
{$Think.get.id} //在模板文件里獲取get請求的id
案例:
{//輸出本機所有的環境變量}
環境變量:{$Think.server.path}<br/>
獲取get傳值:{$Think.get.id}<br/>
獲取get和post傳值:{$Think.request.id}<br/>
{//獲取PHP的Session ID}
PHP的session ID:{$Think.cookie.PHPSESSID}<br/>
{//當前默認分組DEFAULT_MODULE,輸出Home}
配置項:{$Think.config.DEFAULT_MODULE}
輸出結果:
環境變量:C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Git\cmd;C:\PHPTutorial\MySQL;C:\AppServ\Apache24\bin;C:\AppServ\php5;C:\AppServ\MySQL\bin
獲取get傳值:1
獲取get和post傳值:1
PHP的session ID:kna70hjenfhuijnv7ca5itc423
配置項:Home
(11)視圖中使用函數
在實際開發中,有些變量不能直接使用。舉個例子,數據表中存儲時間一般都為時間戳格式,展示的時候需要處理格式化,操作相對繁瑣。這個時候便涉及到了視圖中使用函數
語法格式:{$變量|函數名1|函數名2=參數1,參數2...,###}
參數說明:
$變量:模板變量;
|:變量修飾符;
函數1:要使用的第一個函數;
函數2:要使用的第二個函數;參數1:函數2的參數;
=:類似於PHP函數名后面的();
###:表示變量本身;
案例一:時間戳time()的格式化
PHP中的格式化語法:date('Y-m-d H-i-s',time()),而在模板html中的語法為
PHP→ $time = time(); $this->assign('time',$time); $this->display(); HTML→ {$time|date='Y-m-d H:i:s',###}
ThinkPHP中為了不再使用變量本身,使用###來代替變量本身
注意:
1. ###:當需要使用的函數只有一個參數並且參數是變量自身時,###可以省略不寫;函數有多個參數,但是其第一個參數是變量自身時,也可以省略不寫;
2. 函數名對應的函數必須是PHP內置函數或函數庫(分為系統函數庫、自定義函數庫)文件里定義好的函數;
案例二:定義一個字符串,截取前5個字符,並轉換為大寫
//定義字符串、變量傳遞、模板展示
$str = 'aBcDeFgHiJkLmN'; $this->assign('str',$str); $this->display();
截取字符串:substr();字符串轉化為大寫strtoupper()
視圖參數轉換處理
{$str|substr=###,0,5|strtoupper=###}
(12)默認值
使用場景:在論壇的個性簽名處,如果用戶什么都沒寫,一般默認會顯示-----------→這個家伙很懶,什么都沒留下
默認值:當某個變量不存在或為空時,便會顯示默認字符或默認值
語法:{$變量名|default = 默認值},結合上面視圖中函數的使用。這里可以理解為{$變量名|函數名=參數},而default為ThinkPHP封裝的函數
個性簽名:{$sign|default='這個人很懶,什么也沒留下...'}
(13)運算符
加減乘除取余,自增自減
{$a+$b},{$a-$b},{$a*$b},{$a/$b},{$a%$b},{$a++}或{++$a},{$a--}或{--$a}
(14)文件引入
提出公共部分,后期維護方便
若首位公共部分不拿出來,則會造成兩個問題①代碼重復;②后期維護不便
PHP里引入文件可以用include和require,但在ThinkPHP只提供了一個模板標簽include,可以引入公共部分代碼。不能用require
PHP里require和include區別:include出錯時會發出警告級別提示並繼續執行;而require會生成致命錯誤,並停止腳本執行
語法:<include file='需要引入的模板文件'/>
案例:
public function header(){//展示頭部 $this->display();//展示模板 } public function body(){ $this->display(); } public function footer(){//展示尾部 $this->display(); }
先檢驗三個模板可以展示成功后,再進行文件的引入
文件引入注意:①相對路徑是相對於入口文件來說的相對路徑,而不是當前文件;
<include file='./Application/Admin/View/Public/header.html'/> <!--公共頭文件header.html,相對於入口文件index.php的相對路徑-->
為什么相對路徑是針對入口文件呢?
因為<include />標簽是模板引擎標簽,在服務器端入口文件進行解析,解析完成后才輸出到瀏覽器。所以是相對於入口文件。
在實際開發中,因為路徑過長,容易寫錯,但服務器端還不會報錯。所以常用另外一種寫法:
<include file='View目錄名/模板文件名(不加后綴)' />
例如上述路徑還可以改為:
<include file='Public/header'/> <!--目錄名/模板文件名(不加后綴)-->
拓展:<include />標簽還可以傳遞參數,語法:<include file='模板文件' 參數名='參數值' />
案例:例如網站底部常見的Copyright© 2009-2018 格式,它是隨着時間變化的,所以可以傳遞參數。在body部分的引入尾部文件部分加上參數
<include file='Public/header' value='2019-2020'/>
注意:參數值必須加‘’,不管數據類型是什么。否則會報XML語法錯誤
之后在底部文件foot.html中使用該參數[參數名]
Copyright© [value]
注意:若參數不存在,則會原樣輸出到瀏覽器,顯示為Copyright© [value]
(15)視圖中數組循環遍歷volist、foreach
在ThinkPHP里,系統提供了兩個標簽volist和foreach來實現數組在模板中的遍歷操作
①volist語法:(雙標簽語句,所以需要閉合)
<volist name='變量數組名(前面沒有$)' id='當前遍歷到的元素'>
循環體
</volist>
對比:foreach對應關系
$key可以去掉,所以可以改為
fireach($variable as $value){//這里變量數組名=$variable,id=$value
# code...
}
foreach ($variable as $key => $value) {
# code...
}
②foreach語法:
<foreach name='變量數組名(前面沒有$)' item='當前遍歷到的元素'>
循環體
</doreach>
volist和foreach區別:
volist除了name和id屬性對外,還支持更多屬性對。如mod、key、length、offset等;而foreach標簽除了上述name、item外,只支持key,其他均不支持。可以理解成foreach標簽
是volist標簽的簡化版本。若想多樣化控制輸出,例如遍歷數組輸出偶數,或者輸出第5-10的元素、為空提示等,可以使用<volist>標簽控制。
實際開發里推薦使用volist標簽,即使以后需要加多樣化屬性控制,只需在volist標簽后加上屬性對即可。
案例:
①一維數組遍歷
控制器: //一維數組 $array = array('one',2,3,4,5,6); $this->assign('array',$array); $this->display(); 模板: <!-- 參考PHP的foreach的$value,id名隨意。但在PHP里一般起名叫vol --> <volist name='array' id='vol'> {$vol}, </volist>
或者
<foreach name='array' item='for'>
{$for}
</foreach>
②二維數組遍歷
//控制器變量傳遞及模板展示 $array = array( array('one','two'),array('three','four') ); dump($array); $this->assign('array',$array); $this->display(); //(1)循環后逐個讀取(該方法需要先知道數組構成) <volist name='array' id='vol'> {$vol.0},{$vol.1}, </volist> //(2)volist嵌套循環 <volist name='array' id='vol'> <volist name='vol' id='vo'> {$vo}, </volist> </volist>
或者foreach嵌套循環
(16)if標簽
PHP中if判斷作用是流程控制,在ThinkPHP里同樣也可以用於流程控制
語法:(注意<if></if>標簽閉合)
<if condition='條件表達式'> 輸出結果1 <elseif condition='條件表達式2'/> 輸出結果2
<elseif condition='條件表達式3'/>
輸出結果3 <else/> 輸出結果
</if>
案例:php里輸出當天星期的數字,將變量傳遞到目標中。根據if判斷條件的不同,輸出顯示當天星期
//控制器,根據手冊查詢可以得知N表示1(表示星期一)到 7(表示星期天) $time=date('N',time()); dump($time);//輸出string(1-7)
接下來在模板里編寫if判斷輸出代碼
<if condition='$time == 1'> 今天是周一 <elseif condition='$time == 2' /> 今天是周二 <elseif condition='$time == 3' /> 今天是周三 <elseif condition='$time == 4' /> 今天是周四 <elseif condition='$time == 5' /> 今天是周五 <elseif condition='$time == 6' /> 今天是周六 <else/> 今天是周日 </if>
注意:ThinkPHP的elseif間沒有空格,JS里有
(17)PHP標簽
PHP標簽指在模板中使用PHP語法格式
ThinkPHP支持兩種形式標簽①PHP內置的標簽<?php 代碼段 ?>;②ThinkPHP封裝的PHP標簽<php>代碼段</php>
原始PHP標簽:<?php echo tony; ?><br/> ThinkPHP封裝的標簽:<php>echo tony;</php>
注意:實際開發中不建議在模板中使用PHP標簽(不管原生還是封裝好的),為什么呢?
之前說過,編程的3個階段混編、模板引擎、MVC。當前框架是遵循MVC設計規范設計的,如果在模板里加入PHP標簽就變成混編,打破了MVC的設計規范
在配置項里,有一個配置項(TMPL_DENY_PHP即tmplate deny php拒絕php模板),可以禁用PHP標簽。該配置項在系統配置文件ThinkPHP/Conf/convention.php里
// 布局設置 'TMPL_DENY_PHP' => false, // 默認模板引擎是否禁用PHP原生代碼
開啟后便會禁用原生PHP代碼(不建議禁用),此時在模板文件里<?php ?>原生PHP標簽失效。下面來驗證下,發現報錯
:(
模板禁用PHP代碼
不建議禁用。若禁用了原生PHP標簽,某些功能會異常。比如成功跳轉和失敗跳轉,因為成功跳轉和失敗跳轉使用了原生PHP標簽,禁用的話會跳轉失敗
