ThinkPHP---thinkphp視圖(V)


配置文件分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_PHPtmplate deny php拒絕php模板),可以禁用PHP標簽。該配置項在系統配置文件ThinkPHP/Conf/convention.php里

// 布局設置
'TMPL_DENY_PHP'         =>  false, // 默認模板引擎是否禁用PHP原生代碼

開啟后便會禁用原生PHP代碼(不建議禁用),此時在模板文件里<?php ?>原生PHP標簽失效。下面來驗證下,發現報錯

:(
模板禁用PHP代碼

不建議禁用。若禁用了原生PHP標簽,某些功能會異常。比如成功跳轉和失敗跳轉,因為成功跳轉和失敗跳轉使用了原生PHP標簽,禁用的話會跳轉失敗

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM