ThinkPHP-31

PHP中文网
PHP中文网原創
2016-07-30 13:31:571118瀏覽

基礎:

1. 基礎概念

LAMP

LAMP是基於Linux,Apache,MySQL和PHP的開放資源網路開發平台。這個術語來自歐洲,在那裡這些程序經常用來作為一種標準開發環境。名字來自每個程式的第一個字母。每個程式在所有權裡都符合開放原始碼標準:Linux是開放系統;Apache是​​最通用的網路伺服器;MySQL是帶有基於網路管理附加工具的關聯式資料庫;PHP是流行的物件腳本語言,它包含了多數其它語言的優秀特徵來使得它的網頁開發更加有效。開發者在Windows作業系統下使用這些Linux環境裡的工具稱為使用WAMP。
雖然這些開放原始碼程式本身並不是專門設計成同另外幾個程式一起工作的,但由於它們都是影響較大的開源軟體,擁有很多共同特點,這就導致了這些元件經常在一起使用。在過去的幾年裡,這些組件的兼容性不斷完善,在一起的應用情況變得更加普遍。並且它們為了改善不同組件之間的協作,已經創建了某些擴展功能。目前,幾乎在所有的Linux發布版中都預設包含了這些產品。 Linux作業系統、Apache伺服器、MySQL資料庫和Perl、PHP或 Python語言,這些產品共同組成了一個強大的Web應用程式平台。
隨著開源潮流的蓬勃發展,開放原始碼的LAMP已經與J2EE和.Net商業軟體形成三足鼎立之勢,並且該軟體開發的專案在軟體方面的投資成本較低,因此受到整個IT界的關注。從網站的流量上來說,70%以上的訪問流量是LAMP來提供的,LAMP是最強大的網站解決方案.


OOP

物件導向程式設計(Object Oriented Programming,OOP,物件導向程式設計)是一種電腦程式架構。 OOP 的一個基本原則是電腦程式是由單一能夠發揮子程式作用的單元或物件組合而成。 OOP 達到了軟體工程的三個主要目標:重複使用性、靈活性和擴展性。為了實現整體運算,每個物件都能夠接收訊息、處理資料和向其它物件發送訊息。 OOP 主要有以下的概念和組件: 
組件 - 資料和功能一起在運作的電腦程式中形成的單元,組件在 OOP 電腦程式中是模組和結構化的基礎。 
抽象性 - 程式有能力忽略正在處理中資訊的某些方面,即對資訊主要方面的關注能力。 
封裝 - 也稱為資訊封裝:確保元件不會以不可預期的方式改變其它元件的內部狀態;只有在那些提供了內部狀態改變方法的元件中,才可以存取其內部狀態。每類元件都提供了一個與其它元件聯繫的接口,並規定了其它元件進行呼叫的方法。 
多型性 - 元件的引用和類別集會涉及其它許多不同類型的元件,而且引用元件所產生的結果得依據實際呼叫的型別。 
繼承性 - 允許在現存的元件基礎上建立子類別元件,這統一並增強了多態性和封裝性。典型地來說就是用類別來將元件分組,而且還可以定義新類別為現存的類別的擴展,這樣就可以將類別組織成樹狀或網狀結構,這體現了動作的通用性。 
由於抽象性、封裝性、重複使用性以及便於使用等方面的原因,以元件為基礎的程式設計在腳本語言中已經變得特別流行。


MVC

MVC是一個設計模式,它強制性的使應用程式的輸入、處理和輸出分開。使用MVC應用程式被分成三個核心部件:模型(M)、視圖(V)、控制器(C),它們各自處理自己的任務。 
視圖 :視圖是使用者看到並與之互動的介面。對老式的網路應用程式來說,視圖就是由HTML元素組成的介面,在新式的網路應用程式中,HTML依舊在視圖中扮演著重要的角色,但有些新的技術已層出不窮,它們包括Adobe Flash和象XHTML,XML/XSL,WML等一些識別語言和Web services。如何處理應用程式的介面變得越來越有挑戰性。 MVC一個大的好處是它能為你的應用程式處理很多不同的視圖。在視圖中其實沒有真正的處理發生,不管這些資料是線上儲存的還是一個僱員列表,作為視圖來講,它只是作為一種輸出資料並允許使用者操縱的方式。 
模型 :模型表示企業資料與商業規則。在MVC的三個部件中,模型擁有最多的處理任務。例如它可能用象EJBs和ColdFusion Components這樣的構件物件來處理資料庫。被模型回傳的資料是中立的,就是說模型與資料格式無關,這樣一個模型能為多個視圖提供資料。由於應用於模型的程式碼只需寫一次就可以被多個視圖重複使用,所以減少了程式碼的重複性。 
控制器 :控制器接受使用者的輸入並呼叫模型和視圖去完成使用者的需求。所以當點擊Web頁面中的超連結和發送HTML表單時,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定呼叫哪個模型構件去處理請求,然後確定用哪個視圖來顯示模型處理傳回的資料。
現在我們總結MVC的處理過程,首先控制器接收用戶的請求,並決定應該調用哪個模型來進行處理,然後模型用業務邏輯來處理用戶的請求並返回數據,最後控制器用相應的視圖格式化模型傳回的數據,並透過表示層呈現給使用者。


ORM

物件-關係映射(Object/Relation Mapping,簡稱ORM),是隨著物件導向的軟體開發方法發展而產生的。物件導向的開發方法是當今企業級應用程式開發環境中的主流開發方法,關聯式資料庫是企業級應用程式環境中永久存放資料的主流資料儲存系統。對象和關聯式資料是業務實體的兩種表現形式,業務實體在記憶體中表現為對象,在資料庫中表現為關聯式資料。記憶體中的物件之間存在關聯和繼承關係,而在資料庫中,關係資料無法直接表達多對多關聯和繼承關係。因此,物件-關聯映射(ORM)系統一般以中間件的形式存在,主要實現程式物件到關聯式資料庫資料的映射。
物件導向是從軟體工程基本原則(如耦合、聚合、封裝)的基礎上發展起來的,而關聯式資料庫則是從數學理論發展而來的,兩套理論存在顯著的差異。為了解決這個不匹配的現象,物件關係映射技術應運而生。


AOP

AOP(Aspect-Oriented Programming,面向方面程式設計),可以說是OOP(Object-Oriented Programing,物件導向程式設計)的補充和完善。 OOP引入封裝、繼承和多態性等概念來建立一種物件層次結構,以模擬公共行為的一個集合。當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關係,但不適合定義從左到右的關係。例如日誌功能。日誌程式碼往往水平地散佈在所有物件層次中,而與它所散佈到的物件的核心功能毫無關係。對於其他類型的程式碼,如安全性、異常處理和透明的持續性也是如此。這種散佈在各處的無關的程式碼稱為橫切(cross-cutting)程式碼,在OOP設計中,它導致了大量程式碼的重複,而不利於各個模組的重用。而AOP技術則恰恰相反,它利用一種稱為「橫切」的技術,剖解開封裝的物件內部,並將那些影響了多個類別的公共行為封裝到一個可重用模組,並將其名為“Aspect”,即方面。所謂“方面”,簡單地說,就是將那些與業務無關,卻為業務模組所共同調用的邏輯或責任封裝起來,便於減少系統的重複代碼,降低模組間的耦合度,並有利於未來的可操作性和可維護性。 AOP代表的是一個橫向的關係,如果說「物件」是一個空心的圓柱體,其中封裝的是物體的屬性和行為;那麼面向方面編程的方法,就彷彿一把利刃,將這些空心圓柱體剖開,以獲得其內部的消息。而剖開的切面,也就是所謂的「面向」了。然後它又以巧奪天功的妙手將這些剖開的切面復原,不留痕跡。
使用「橫切」技術,AOP把軟體系統分成兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處都基本相似。例如權限認證、日誌、事務處理。 Aop 的作用在於分離系統中的各種關注點,將核心關注點和橫切關注點分開。正如Avanade公司的高級方案架構師Adam Magee所說,AOP的核心思想就是「將應用程式中的商業邏輯同對其提供支援的通用服務進行分離。」


CURD

CURD是一個資料庫

CURD

CURD是一個資料庫技術中的縮寫詞,一般的專案所發展的各種參數的基本功能都是CURD。它代表創建(Create)、更新(Update)、讀取(Read)和刪除(Delete)操作。 CURD 定義了用於處理資料的基本原子操作。之所以將CURD 提升到技術難題的高度是因為完成一個涉及在多個資料庫系統中進行CURD操作的匯總相關的活動,其效能可能會隨資料關係的變化而有非常大的差異。

CURD在具體的應用中並非一定使用create、update 、read和delete字樣的方法,但是他們完成的功能是一致的。例如,ThinkPHP就是使用add、save、select和delete方法表示模型的CURD操作。


ActiveRecord

Active Record(中文名:活動記錄)是一種領域模型模式,特徵是一個模型類別對應關係型資料庫中的一個表,而模型類別的一個實例對應表中的一行記錄。 Active Record 和 Row Gateway (行記錄入口)十分相似,但前者是領域模型,後者是資料來源模式。關係型資料庫往往透過外鍵來表述實體關係,Active Record 在資料來源層面上也將這種關係​​映射為物件的關聯和聚集。   Active Record 適合非常簡單的領域需求,尤其在領域模型和資料庫模型十分相似的情況下。如果遇到更複雜的領域模型結構(例如用到繼承、策略的領域模型),往往需要使用分離資料來源的領域模型,結合 Data Mapper (資料映射器)來使用。

Active Record 驅動框架一般兼有 ORM 框架的功能,但 Active Record 不是簡單的 ORM,正如和 Row Gateway 的區別。由Rails最早提出,遵循標準的ORM模型:表格映射到記錄,記錄映射到對象,字段映射到對象屬性。配合遵循的命名和配置慣例,能夠很大程度的快速實現模型的操作,而且簡潔易懂。

🎜🎜🎜🎜單一入口🎜

單一入口通常是指一個專案或應用具有一個統一(但不一定是唯一)的入口文件,也就是說專案的所有功能操作都是透過這個入口文件進行的,並且往往入口文件是第一步被執行的。
單一入口的好處是專案整體比較規範,因為同一個入口,往往其不同操作之間具有相同的規則。另外一個方面就是單一入口帶來的好處是控制較為靈活,因為攔截方便了,類似如一些權限控制、用戶登入方面的判斷和操作可以統一處理了。
或有些人會擔心所有網站都透過一個入口文件進行訪問,是否會造成太大的壓力,其實這是杞人憂天的想法。

2. 目錄結構


. Conf框架設定檔目錄Lang框架系統語言目錄Lib系統核心基類庫目錄框架擴充目錄(關於擴充目錄的詳細資訊請參考後面的擴充章節)

注意:如果你下載的是核心版本,有可能Extend目錄是空的,因為ThinkPHP本身不依賴任何擴充。



3. 命名規範

使用ThinkPHP開發的過程中應該盡量遵循下列命名規範:

  • 類文件都是以.class.php為後綴。的類庫文件,不代表外部加載的類庫文件),使用駝峰法命名,並且首字母大寫,例如DbMysql.class.php;

  • 確保文件的命名和調用大小寫一致,是由於在類Unix系統上面,對大小寫是敏感的(而ThinkPHP在調試模式下面,即使在Windows平台也會嚴格檢查大小寫);

  • 類名和文件名一致(包括上面所說的大小寫一致),例如UserAction類別的檔案命名是UserAction.class.php, InfoModel類別的檔案名稱是InfoModel.class.php,且不同的類別庫的類別命名有一定的規格;

  • 函數、設定檔等其他類別程式庫檔案以外的一般是以.php為後綴(第三方引入的不做要求);

  • 函數的命名使用小寫字母和下劃線的方式,例如get_client_ip;

  • 方法的命名使用駝峰法,並且首字母小寫或使用下劃線“_”,例如getUserName,_parseType,通常下劃線開頭的方法屬於私有方法;

  • 屬性的命名使用駝峰法,並且首字母小寫或使用下劃線“_”,例如tableName、_instance ,通常下劃線開頭的屬性屬於私有屬性;

  • 以雙下劃線「__」打頭的函數或方法作為魔法方法,例如__call 和__autoload;

  • 常數和MANY_TO_MANY;

  • 設定參數以大寫字母和底線命名,例如HTML_CACHE_ON;

  • 語言變數以大寫字母和底線命名,例如MY_LANG,以下劃線變數CLASS_NOT_EXIST_;

  • 對變數的命名沒有強制的規範,可以根據團隊規範來進行;

  • ThinkPHP的模板檔案預設是以.html 為後綴

    (和字段採用小寫加下劃線方式命名,並注意字段名不要以下劃線開頭,例如think_user 表和user_name字段,類似_username 這樣的資料表字段可能會被過濾。

在ThinkPHP裡面,有一個函數命名的特例,就是單字母大寫函數,這類函數通常是某些操作的快捷定義,或者有特殊的作用。例如,ADSL方法等等。

另外有一點非常關鍵,ThinkPHP預設全部使用UTF-8編碼,所以請確保你的程式檔案採用UTF-8編碼格式保存,並且去掉BOM訊息標頭(去掉BOM頭訊息有很多方式,不同的編輯器都有設定方法,也可以用工具進行統一檢測和處理),否則可能會導致許多意想不到的問題。


4. CBD架構

ThinkPHP3.0版本引入了全新的CBD(核心Core+行為Behavior+驅動Driver)架構模式,因為從底層開始,框架就採用核心+行為+驅動的架構體系,核心架構保留了最關鍵的部分,並在重要位置設置了標籤用以標記,其他功能都採用行為擴展和驅動的方式組合,開發人員可以根據自己的需要,對某個標籤位置進行行為擴展或者替換,就可以方便的客製化框架底層,也可以在應用層中添加自己的標籤位置和添加應用程式行。而標籤位置類似於AOP概念中的“切面”,行為都是圍繞這個“切面”來進行編程,如果把系統內置的核心擴展看成是一種標準模式的話,那麼用戶可以把這一切的行為定制打包成一個新的模式,所以在ThinkPHP裡面,稱之為模式擴展,事實上,模式擴展不僅可以替換和增加行為,還可以對底層的MVC進行替換和修改,以達到量身定制的目的。利用這一新的特性,開發人員可以方便地透過模式擴展為自己量身定制一套屬於自己或企業的開發框架,新版的模式擴展是框架擴展的集大成者,開創了新的里程碑,這正是新版的真正魅力所在。

5. 開發流程

使用ThinkPHP建立應用的一般開發流程是:

系統設計、建立資料庫和資料表;(選用)
  • 專案命名並建立資料庫與資料表;(選用)
  • 專案命名並建立建立資料庫與資料表;
  • 完成專案配置;
  • 建立專案函數庫;(選用)
  • 開發專案所需的擴充(模式、驅動、標籤庫等);(選用)
  • 開發專案所需的擴充(模式、建立、標籤庫等);控制器類別;

  • 建立模型類別;(選用)

  • 建立範本檔案;

  • 運作與除錯、分析日誌;

  • 開發和設置緩存功能;(可選)

  • 添加路由支持;(可選)

  • 安全檢查;(可選 )

  • 部署到生產環境。


6. 入口文件

ThinkPHP採用單一入口模式進行項目部署和訪問,無論完成什麼功能,一個項目都有一個統一(但不一定是唯一)的入口。應該說,所有專案都是從入口文件開始的,並且所有的專案的入口文件是類似的,入口文件中主要包括:

  • 定義框架路徑、專案路徑和專案名稱(可選)

  • 定義調試模式和運作模式的相關常數(選用)

  • 載入框架入口檔案(必須)


7. 專案目錄

目錄/檔案 說明
7.項目目錄目錄說明Common專案公用檔案目錄,一般放置專案的公用程式。 Lang專案語言套件目錄(選用 如果不需要多語言支援 可刪除)Lib專案類別庫目錄,通常包含Action和Model子目錄專案類別庫目錄,通常包含Action和Model子目錄。 ,支援範本主題Runtime專案運行時目錄,包括Cache(範本快取)、Temp(資料快取)、Data(資料目錄)和Logs(日誌檔案)子目錄,如果存在分組的話,則首先是分組目錄。 如果需要把index.php 移到App目錄的外面,只需要在入口檔案中增加專案名稱和專案路徑定義。
生成的項目目錄和目錄:

  •     //定義專案名稱
  •     
  •     define('APP_PATH', './App/');
  •     //載入框架入檔案
  •     require './App/ThinkPHP/ThinkPHPAPP.APPf;;; ,通常是專案的目錄名稱,如果你的專案是直接部署在Web根目錄下面的話,那麼需要設定APP_NAME 為空。
  • APP_PATH 是指專案路徑(必須以「/」結束),專案路徑是指專案的Common、Lib目錄所在的位置,而不是專案入口檔案所在的位置。
  • 注意:在類別Unix或Linux環境下面Runtime目錄需要可寫權限。

  • 8.部署目錄



    目錄/檔案

    說明


    )目錄?

    Public

    網站公共資源目錄(存放網站的Css、Js和圖片等資源)Home目錄(下面的目錄項目目錄應用目錄)Admin後台管理專案目錄… 更多的專案目錄index.phpphp的入口文件… 更多的專案入口文件

    項目的模板文件還是放到項目的Tpl目錄下面,只是將外部調用的資源文件,包括圖片JS 和CSS統一放到網站的公共目錄Public下面,分Images、Js和Css子目錄存放,如果有可能的話,甚至也可以把這些資源檔案單獨放一個外部的伺服器遠端調用,並進行最佳化。

    事實上,系統目錄和專案目錄可以放到非WEB訪問目錄下面,網站目錄下面只需要放置Public公共目錄和入口文件,從而提高網站的安全性。

    如果希望自己設定目錄,可以在入口檔案裡面更改RUNTIME_PATH常數進行更改,例如:

    1. define('RUNTIME_PATH','./App/temp/');為可寫入權限。

      除了自訂編譯快取目錄之外,也支援自訂編譯快取檔案名,例如:


    define('RUNTIME_FILE','./App/temp/runtime_cache.php');所有設定檔的定義格式皆採用傳回PHP陣列的方式,格式為:

    1. //專案設定檔

     return array(

     //預設模組
    1.     'URL_MODEL'          => '2', //URL模式🠎
    2.     //更多設定參數
    3.     /// ...
    4.  );
    5. 配置參數不區分大小寫(因為無論大小寫定義都會轉換成小寫)

    6. 還可以在配置文件中可以使用更二組元組來進行維數組多的信息,例如:

    7. //项目配置文件
       return array(
          'DEFAULT_MODULE'     => 'Index', //默认模块
          'URL_MODEL'          => '2', //URL模式
          'SESSION_AUTO_START' => true, //是否开启session
          'USER_CONFIG'        => array(
              'USER_AUTH' => true,
              'USER_TYPE' => 2,
          ),
          //更多配置参数
          //...
       );
    8. 需要注意的是,二級參數配置區分大小寫,也就說讀取確保和定義一致。



    9. 慣例配置和項目配置,調試配置

    慣例重於配置是系統遵循的一個重要思想,系統內置有一個慣例配置文件(位於系統目錄下面的Confconvention.php),按照大多數的使用對常用參數進行了預設配置。
    1. 專案設定檔是最常用的設定文件,專案設定檔位於專案的設定檔目錄Conf下面,檔案名稱是config.php。
    2. 在專案設定檔裡面除了新增內建的參數配置外,還可以額外新增專案所需的設定參數。

    如果沒有配置應用狀態,系統預設則預設為debug狀態,也就是說預設的設定參數是:

    'APP_STATUS' => 'debug', //应用调试模式状态


    debug.php設定檔只需要設定和專案設定檔以及系統偵錯設定檔不同的參數或新增的參數。


    如果想在調試模式下方增加應用狀態,例如測試狀態,則可以在專案設定檔中變更設定如下:


    'APP_STATUS' => 'test', //应用调试模式状态

    由於調試模式沒有任何緩存,因此涉及較多緩存,因此涉及較多的檔案IO操作和模板即時編譯,所以在開啟調試模式的情況下,效能會有一定的下降,但不會影響部署模式的效能。
    1. 注意:一旦關閉調試模式,專案的調試設定檔即刻失效。

      10. 分組配置和讀取配置,動態配置
    1. 如果啟用了模組分組,則可以在對每個分組單獨定義配置文件,分組配置文件位於:

      項目配置目錄/分組名稱/config.php
    2. 可以透過以下設定啟用分組:
    3. 'APP_GROUP_LIST' => 'Home,Admin', //项目分组设定
       'DEFAULT_GROUP'  => 'Home', //默认分组


    4. 現在定義了Home和Admin兩個分組,則我們可以定義分組設定檔如下:

    Conf/Home/config.php
    Conf/Admin/config.php

    每個分組的設定檔僅在目前分組有效,分組配置的定義格式和項目配置是一樣的。

    注意:分組名稱區分大小寫,必須和定義的分組名一致。

    定義了配置檔案之後,可以使用系統提供的C方法(如果覺得比較奇怪的話,可以藉助Config單字來幫助記憶)來讀取已有的配置:

      C('參數名稱') //取得已設定的參數值

    例如,C('APP_STATUS') 可以讀取到系統的偵錯模式的設定值,如果APP_STATUS尚未存在設置,則傳回NULL。



    C方法同樣可以用來讀取二維設定:

      C('USER_CONFIG.USER_TYPE')//取得使用者設定中的使用者類型設定
    ,因此C方法可以在任何地方讀取任何配置,即使某個設定參數已經生效過期了。


    在具體的Action方法裡面,我們仍然可以對某些參數進行動態配置,主要是指那些還沒有被使用的參數。
    設定新的值:

    1. C('參數名稱','新的參數值');

    例如,我們需要動態改變資料快取的有效期限的話,可以使用

    1. DATA_CACHE_TIME','60');


    也可以支援二維數組的讀取和設置,使用點語法進行操作,如下:

    獲取已設定的參數值:

    1. USER_CONFIG.USER_TYPE');

    設定新的值:

    1. C('USER_CONFIG.USER_TYPE','1');

    版本僅對批次設定有效,使用方法:


    C($array,'name');

    1. 其中array是數組變量,會把批次設定後的設定參數清單儲存到name標識的快取資料中

      取得快取的設定清單資料可以用


    C('','name'); //或C(null,'name');

    1. 會讀取name的快取設定資料到當前配置資料(合併)。


    11. 擴充配置


    專案設定檔在部署​​模式的時候會納入編譯緩存,也就是說編譯後再修改專案設定檔就不會立刻生效,需要刪除編譯快取後才能生效。擴充設定檔則不受此限制影響,即使在部署模式下面,修改配置後可以即時生效,並且配置格式和專案配置一樣。

    設定擴充配置的方式如下(多個檔案以逗號分隔):


    'LOAD_EXT_CONFIG' => 'user,db', // 載入檔案

    1. 專案載入檔案php 和db.php分別用於使用者設定和資料庫配置,那麼會自動載入專案配置目錄下面的設定檔Conf/user.php和Conf/db.php。

    2. 若希望採用二級設定方式,可以設定如下:

    'LOAD_EXT_CONFIG' => array(

    1.    'DB'   = > 'db', //資料庫設定

    2.  ), //載入擴充設定檔

    3.  ), //載入擴充設定檔

    4. 同樣的user.php 設定檔內容,但最終取得使用者參數的方式就變成了:

    1. C('USER.USER_AUTH_ID');

    這種方式可以避免大項目情況中的參數衝突問題。


    下面的一些設定檔已經被系統使用,請不要重新定義為自訂的擴充配置

    Uploads 網站上傳目錄(用戶上傳的統一目錄)
    Home 目錄目錄(
    . tags.php專案行為設定檔alias.php專案別名定義檔de. 專案追加的核心編譯清單檔案(不會覆蓋核心編譯清單)
    檔案名稱 說明
    core.php


    12. 函式庫


    ThinkPHP中的函式庫可以分為系統函式庫和專案函式庫。


    系統函數庫

    庫系統函數庫位於系統的Common目錄下面,有三個檔案:
    common.php是全域必須載入的基礎函式庫,在任何時候都可以直接呼叫;
    functions.php是全域必須載入的基礎函式庫,在任何時候都可以直接呼叫;
    functions.php是全域必須載入的基礎函式庫,在任何時候都可以直接呼叫;

    functions.php是框架標準模式的公共函數庫,其他模式可以替換加載自己的公共函數庫或對公共函數庫中的函數進行重新定義;

    runtime.php是框架運行時文件,僅在調試模式或編譯過程才會被加載,因此其中的方法在項目中不能直接調用;

    項目函數庫

    庫項目函數庫通常位於項目的Common目錄下面,文件名為common.php,該文件會在執行過程中自動加載,並且合併到專案編譯統一緩存,如果使用了分組部署方式,並且該目錄下存在"分組名稱/function.php"文件,也會根據當前分組執行時對應進行自動加載,因此項目函數庫的所有函數也都可以無需手動載入而直接使用。

    如果專案配置中使用了動態函數載入配置的話,專案Common目錄下面可能會存在更多的函數文件,動態載入的函數文件不會納入編譯快取。

    在特殊的情況下,模式可以改變自動載入的項目函數庫的位置或名稱。

    擴充函式庫

    函式庫我們可以在專案公用目錄下面定義擴充函式庫,方便需要的時候載入和呼叫。擴展函數庫的函數定義規範和項目函數庫一致,只是函數庫文件名可以隨意命名,一般來說,擴展函數庫並不會自動加載,除非你設定了動態載入。

    函數加載

    系統函數庫和項目函數庫中的函數無需加載就可以直接調用,對於項目的擴展函數庫,可以採用下面兩種方式調用:

    動態載入
      我們可以在項目的擴展函數庫,可以採用下面兩種方式調用:
    1. 動態載入

      我們可以在項目在設定檔中定義LOAD_EXT_FILE參數,例如:

    "LOAD_EXT_FILE"=>"user,db"

      透過上面的設定,就會執行過程中自動擴充到專案公用目錄.php和db.php,這樣就可以直接在專案中呼叫擴充函數函式庫user.php和db.php中的函數了,而且擴充函數函式庫的函式修改是即時生效的。
    1. 手動載入

      如果你的函數只是個別模組偶爾使用,則不需要採用自動載入方式,可以在需要呼叫的時候採用load方法手動載入,方式如下:

    load("@.user" )


    @.user表示載入目前專案的user函數文件,這樣就可以直接user.php擴充函數庫中的函數了。

    13. 類別庫ThinkPHP的類別庫包括基類庫和應用類別庫,系統的類別庫命名規則如下:器類模組名+Action例如 UserAction、InfoAction模型類別模型名稱+Model例如 UserModel、InfoModel例如 UserModel、InfoModel模型名稱+Model RouteBehaviorWidget類別Widget名稱+Widget例如BlogInfoWidget驅動類別引擎名稱+驅動名稱目錄
    類庫命名規則如下:
    模型名稱+Model
    基類庫是指符合ThinkPHP類庫規範的系統類庫,包括ThinkPHP的核心基類庫和擴展基類庫。核心基類庫目錄位於系統的Lib目錄,核心基類庫也就是Think類庫,而擴展基類庫位於Extend/Library目錄,可擴展ORG 、Com擴充類庫。核心基類庫的作用是完成框架的通用性開發而必須的基礎類和內建支援類等,包含有:

    調用路徑

    說明

    調用路徑說明調用路徑說明調用路徑說明調用路徑說明 .Core核心類別庫包Lib/BehaviorThink.Behavior內建行為類別庫包內建模板引擎類別庫包
    ink Lib/Template Think.Template
    🎜🎜

    核心類別庫包下麵包含下面核心類別庫:

    Action系統基礎控制器類ActionAction系統基礎控制器類 Behavior系統行為基礎類別Cache系統快取類Db系統抽象資料庫類別系統抽象資料庫類 ModelThinkThinkException get系統Widget基礎類應用類別庫
    類名 說明
    Action 系統基礎控制器類
    系統基礎控制器類
    Action
    Db
    系統日誌類
    系統基礎模型類別
    系統入口與靜態類別
    系統基礎異常類 ThinkException
    應用程式庫是指專案中自己定義或使用的類別庫,這些類別庫也是遵循ThinkPHP的命名規範。應用程式類別庫目錄位於專案目錄下面的Lib目錄。應用類庫的範圍很廣,包括Action類庫、Model類庫或者其他的工具類庫,通常包括:

    目錄調用路徑說明Lib/Action@. Action或自動載入控制器類別庫包Lib/Model@.Model或自動載入模型類別庫包
    🜟應用行為類別庫包
    Lib/Widget 用W方法在模板中呼叫 應用Widget類別庫包

    项目根据自己的需要可以在项目类库目录下面添加自己的类库包,例如Lib/Common、Lib/Tool等。


    类库导入

    一、Import显式导入

    ThinkPHP模拟了Java的类库导入机制,统一采用import方法进行类文件的加载。import方法是ThinkPHP内建的类库导入方法,提供了方便和灵活的文件导入机制,完全可以替代PHP的require和include方法。例如:

    1. import("Think.Util.Session");
       import("App.Model.UserModel");

    import方法具有缓存和检测机制,相同的文件不会重复导入,如果导入了不同的位置下面的同名类库文件,系统也不会再次导入

    注意:在Unix或者Linux主机下面是区别大小写的,所以在使用import方法的时候要注意目录名和类库名称的大小写,否则会导入失败。对于import方法,系统会自动识别导入类库文件的位置,ThinkPHP的约定是Think、ORG、Com包的导入作为基类库导入,否则就认为是项目应用类库导入。

    1. import("Think.Util.Session");
       import("ORG.Util.Page");

    上面两个方法分别导入了Think基类库的Util/Session.class.php文件和ORG扩展类库包的Util/Page.class.php文件。

    要导入项目的应用类库文件也很简单,使用下面的方式就可以了,和导入基类库的方式看起来差不多:

    1. import("MyApp.Action.UserAction");
       import("MyApp.Model.InfoModel");

    上面的方式分别表示导入MyApp项目下面的Lib/Action/UserAction.class.php和Lib/Model/InfoModel.class.php类文件。


    通常我们都是在当前项目里面导入所需的类库文件,所以,我们可以使用下面的方式来简化代码

    1. import("@.Action.UserAction");
       import("@.Model.InfoModel");



    二,别名导入

    除了命名空间的导入方式外,import方法还可以支持别名导入,要使用别名导入,首先要定义别名,我们可以在项目配置目录下面增加alias.php 用以定义项目中需要用到的类库别名,例如:

    1. return array(
          'rbac' =>LIB_PATH.'Common/Rbac.class.php',
          'page' =>LIB_PATH.'Common/Page.class.php',
       );

    那么,现在就可以直接使用:

    1. import("rbac");
       import("page");

    导入Rbac和Page类,别名导入方式禁止使用import方法的第二和第三个参数,别名导入方式的效率比命名空间导入方式要高效,缺点是需要预先定义相关别名。



    导入第三方类库

    第三方类库统一放置在系统扩展目录下的Vendor 目录,并且使用vendor 方法导入,其参数和 import 方法是 一致的,只是默认的值有针对变化。 例如,我们把 Zend 的 Filter\Dir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是 Vendor\Zend\Filter\Dir.php,我们使用vendor 方法导入只需要使用:

    1. Vendor('Zend.Filter.Dir');

    就可以导入Dir类库了。
    Vendor方法也可以支持和import方法一样的基础路径和文件名后缀参数,例如:

    Vendor('Zend.Filter.Dir',dirname(__FILE__),'.class.php');

    自动加载

    在大多数情况下,我们无需手动导入类库,而是通过配置采用自动加载机制即可,自动加载机制是真正的按需加载,可以很大程度的提高性能。自动加载有三种情况,按照加载优先级从高到低分别是:别名自动加载、系统规则自动加载和自定义路径自动加载。

    一、别名自动加载

    在前面我们提到了别名的定义方式,并且采用了import方法进行别名导入,其实所有定义别名的类库都无需再手动加载,系统会按需自动加载。


    二、 系统规则自动加载

    果你没有定义别名的话,系统会首先按照内置的规则来判断加载,系统规则仅针对行为类、模型类和控制器类,搜索规则如下:

    类名 规则 说明
    行为类 规则1 搜索系统类库目录下面的Behavior目录
    规则2 搜索系统扩展目录下面的Behavior目录
    规则3 搜索应用类库目录下面的Behavior目录
    规则4 如果启用了模式扩展,则搜索模式扩展目录下面的Behavior目录
    模型类 规则1 如果启用分组,则搜索应用类库目录的Model/当前分组 目录
    规则2 搜索应用类库下面的Model目录
    规则3 搜索系统扩展目录下面的Model目录
    控制器类 规则1 如果启用分组,则搜索应用类库目录的Action/当前分组 目录
    规则2 搜索项目类库目录下面的Action目录
    规则3 搜索系统扩展目录下面的Action目录

    注意:搜索的优先顺序从上至下 ,一旦找到则返回,后面规则不再检测。如果全部规则检测完成后依然没有找到类库,则开始进行第三个自定义路径自动加载检测。



    三、 自定义路径自动加载

    当你的类库比较集中在某个目录下面,而且不想定义太多的别名导入的话,可以使用自定义路径自动加载方式,这种方式需要在项目配置文件中添加自动加载的搜索路径,例如:

    'APP_AUTOLOAD_PATH' =>'@.Common,@.Tool',
    1. 表示,在当前项目类库目录下面的Common和Tool目录下面的类库可以自动加载。多个搜索路径之间用逗号分割,并且注意定义的顺序也就是自动搜索的顺序。


    2. 注意:自动搜索路径定义只能采用命名空间方式,也就是说这种方式只能自动加载项目类库目录和基类库目录下面的类库文件。



    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    控制器:

    1. URL模式

    传统方式的文件入口访问会变成由URL的参数来统一解析和调度。

    ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式、PATHINFO、REWRITE和兼容模式。


    一、普通模式:设置URL_MODEL 为0
    采用传统的URL参数模式

    1. http://serverName/appName/?m=module&a=action&id=1


    二、PATHINFO模式(默认模式):设置URL_MODEL 为1
    默认情况使用PATHINFO模式,ThinkPHP内置强大的PATHINFO支持,提供灵活和友好URL支持。PATHINFO模式自动识别模块和操作,例如

    http://serverName/appName/module/action/id/1/或者
    http://serverName/appName/module,action,id,1/




    三、REWRITE模式: 设置URL_MODEL 为2
    该URL模式和PATHINFO模式功能一样,除了可以不需要在URL里面写入口文件,和可以定义.htaccess 文件外。在开启了Apache的URL_REWRITE模块后,就可以启用REWRITE模式了,具体参考下面的URL重写部分。

    四、兼容模式: 设置URL_MODEL 为3
    兼容模式是普通模式和PATHINFO模式的结合,并且可以让应用在需要的时候直接切换到PATHINFO模式而不需要更改模板和程序,还可以和URL_WRITE模式整合。兼容模式URL可以支持任何的运行环境。

    兼容模式的效果是:

    1. http://serverName/appName/?s=/module/action/id/1/

    并且也可以支持参数分割符号的定义,例如在URL_PATHINFO_DEPR为~的情况下,下面的URL有效:

    1. http://serverName/appName/?s=module~action~id~1

    其实是利用了VAR_PATHINFO参数,用普通模式的实现模拟了PATHINFO的模式。但是兼容模式并不需要自己传s变量,而是由系统自动完成URL部分。正是由于这个特性,兼容模式可以和PATHINFO模式之间直接切换,而不需更改模板文件里面的URL地址连接。我们建议的方式是采用PATHINFO模式开发,如果部署的时候环境不支持PATHINFO则改成兼容URL模式部署即可,程序和模板都不需要做任何改动。


    2. 模块和操作

    http://域名/项目名/分组名/模块名/操作名/其他参数
    Dispatcher会根据URL地址来获取当前需要执行的项目、分组(如果有定义的话)模块、操作以及其他参数,在某些情况下,项目名可能不会出现在URL地址中(通常情况下入口文件则代表了某个项目,而且入口文件可以被隐藏)。
    每一个模块就是一个控制器类,通常位于项目的Lib\Action目录下面。

    3.1版本开始,增加ACTION_SUFFIX配置参数,用于设置操作方法的后缀。
    例如,如果设置:

    1. 'ACTION_SUFFIX'=>'Act'

    那么访问某个模块的add操作对应读取模块类的操作方法则由原来的add方法变成addAct方法。



    3. 定义控制器和空操作,空模块

    一个应用如果不需要和数据库交互的时候可以不需要定义模型类,但是必须定义Action控制器,一般位于项目的Lib/Action目录下面。
    Action控制器的定义非常简单,只要继承Action基础类就可以了,例如:

    1. Class UserAction extends Action{}

    控制器文件的名称是UserAction.class.php。

    空操作是指系統在找不到指定的操作方法的時候,會定位到空操作(_empty)方法來執行,利用這個機制,我們可以實現錯誤頁面和一些URL的最佳化。

    空模組的概念是指當系統找不到指定的模組名稱的時候,系統會嘗試定位空模組(EmptyAction),利用這個機制我們可以用來自訂錯誤頁面和進行URL的最佳化。


    4.模組分組

    模組分組相關的設定參數包括:

    DEFAULT_GROUP預設分組(預設值為Home)TMPL_FILE_DEPR分組模板下面模組和操作的分隔符,預設值為「/」 g(普通模式URL才需要)

    例如我們把目前的專案分成Home和Admin兩組,分別表示前台和後台功能,那麼只需要在專案配置中加入下面的設定:

    1. 'APP_GROUP_LIST' => 'Home,Admin', / /專案分組設定

    2.  'DEFAULT_GROUP'  => 'Home', //預設分組

    多個分組之間以逗號分隔即可,預設分組只允許設定一個。



    5. URL偽靜態

    ThinkPHP支援偽靜態URL設置,可以透過設定URL_HTML_SUFFIX參數隨意在URL的最後增加你想要的靜態設定,可以透過設定URL_HTML_SUFFIX參數隨意在URL的最後增加你想要的靜態後設置,而不會影響當前操作的字尾正常執行。例如,我們設定

    1. 'URL_HTML_SUFFIX'=>'shtml'

    'URL_HTML_SUFFIX'=>'shtml'

    1. 'URL_HTML_SUFFIX'=>'shtml'

    的話,我們可以把下面的URL

    1. http://serverName/Blog/read/c成

    http://serverName/Blog/read/id/1.shtml

    1. 後者更具有靜態頁面的URL特徵,但是具有和前面的URL相同的執行效果,並且不會影響原來參數的使用。

      注意:偽靜態後綴設定時可以不包含後綴中的「.」。所以,下面的配置其實是等效的:

    'URL_HTML_SUFFIX'=>'.shtml'

    偽靜態設定後,如果需要動態產生一致的URL,可以使用U方法在範本檔案中產生URL。

      3.1版本開始,預設情況下,可以支援所有的靜態後綴,並且會記錄當前的偽靜態後綴到常數__EXT__,但不會影響正常的頁面存取。如果要取得目前的偽靜態後綴,透過常數__EXT__取得即可。
    1. 如果只是希望支援配置的偽靜態後綴,可以直接設定成可以支援多個後綴,例如:

    'URL_HTML_SUFFIX'=>'html|shmtl|xml' // 多個分割


    如果設定了多個偽靜態後綴的話,使用U函數產生的URL位址中會預設使用第一個後綴,也支援指定後綴產生url位址。


    6. URL路由


    ThinkPHP支援URL路由功能,要啟用路由功能,需要設定URL_ROUTER_ON 參數為true。開啟路由功能後,且設定URL_ROUTE_RULES參數後,系統會自動進行路由偵測,如果在路由定義裡面找到和目前URL相符的路由名稱,就會進行路由解析與重定向。

    詳情請見:http://doc.thinkphp.cn/manual/url_route.html


    7.重寫

    詳情請見:http://doc.thinkphp./manual URL/urlcn/manual URL. html

    <code><code><code><code><code><code><code><code><code>.

    為了配合所使用的URL模式,我們需要能夠動態的根據當前的URL設定生成對應的URL位址,為此,ThinkPHP內建提供了U方法,用於URL的動態生成,可以確保專案在移植過程中不受環境的影響。 U方法的定義規則如下(方括號內參數依實際應用決定):<code><code><code><code><code><code><code><code><code>
    ??參數','偽靜態後綴','是否跳轉','顯示域名'])

    <code><code><code><code><code>如果不定義項目和模塊的話就表示當前項目和模塊名稱,以下是一些簡單的例子:<code><code><code><code><code><code>U('User/add')

      U('User/add')/add 'Blog/read?id=1') // 產生Blog模組的read操作 且id為1的URL位址
    1. U('Admin/User/select') // 產生Admin分組的User模組的select作業的URL位址

    <code><code><code><code><code>U方法的第二個參數支援數組和字串兩種定義方式,如果只是第一個定義的方式定義,例如:<code><code><code><code><code><code>U('Blog/cate',array('

    U('Blog/cate',array('cate_array('cate) ('Blog/cate','cate_id=1&status=1')
    1. U('Blog/cate?cate_id=1&status=1')

    <code><code><code><code><code><code><code><code><code>三种方式是等效的,都是 生成Blog模块的cate操作 并且cate_id为1 status为1的URL地址
    但是不允许使用下面的定义方式来传参数

    1. U('Blog/cate/cate_id/1/status/1')

    <code><code><code><code><code><code><code><code><code>

    根据项目的不同URL设置,同样的U方法调用可以智能地对应产生不同的URL地址效果,例如针对

    1. U('Blog/read?id=1')这个定义为例。

    如果当前URL设置为普通模式的话,最后生成的URL地址是: 
    http://serverName/index.php?m=Blog&a=read&id=1
    如果当前URL设置为PATHINFO模式的话,同样的方法最后生成的URL地址是: 
    http://serverName/index.php/Blog/read/id/1
    如果当前URL设置为REWRITE模式的话,同样的方法最后生成的URL地址是: 
    http://serverName/Blog/read/id/1
    如果当前URL设置为REWRITE模式,并且设置了伪静态后缀为.html的话,同样的方法最后生成的URL地址是: 
    http://serverName/Blog/read/id/1.html
    U方法还可以支持路由,如果我们定义了一个路由规则为:

    1.  'news/:id\d'=>'News/read'

    那么可以使用

    1. U('/news/1')

    最终生成的URL地址是:

    1. http://serverName/index.php/news/1


    注意:如果你是在模板文件中直接使用U方法的话,需要采用 {:U('参数1', '参数2'…)} 的方式,具体参考模板引擎章节的8.3 使用函数内容。

    如果你的应用涉及到多个子域名的操作地址,那么也可以在U方法里面指定需要生成地址的域名,例如:

    1. U('Blog/read@blog.thinkphp.cn','id=1');

    @后面传入需要指定的域名即可。
    此外,U方法的第5个参数如果设置为true,表示自动识别当前的域名,并且会自动根据子域名部署设置APP_SUB_DOMAIN_DEPLOY和APP_SUB_DOMAIN_RULES自动匹配生成当前地址的子域名。
    如果开启了URL_CASE_INSENSITIVE,则会统一生成小写的URL地址。

    9. URL大小写

    只要在项目配置中,增加:

    1. 'URL_CASE_INSENSITIVE' =>true

    就可以实现URL访问不再区分大小写了。

    这里需要注意一个地方,如果我们定义了一个UserTypeAction的模块类,那么URL的访问应该是:

    1. http://serverName/index.php/user_type/list

    2.  //而不是

    3. http://serverName/index.php/usertype/list

    利用系统提供的U方法可以为你自动生成相关的URL地址。
    如果设置

    1. 'URL_CASE_INSENSITIVE' =>false

    的话,URL就又变成:

    1. http://serverName/index.php/UserType/list

    注意:URL不区分大小写并不会改变系统的命名规范,并且只有按照系统的命名规范后才能正确的实现URL不区分大小写。

    10. 前置和后置操作

    系统会检测当前操作是否具有前置和后置操作,如果存在就会按照顺序执行,前置和后置操作的方法名是在要执行的方法前面加 _before_和_after_,例如:

    1. class CityAction extends Action{
          //前置操作方法
          public function _before_index(){
              echo &#39;before&#39;;
          }
          public function index(){
              echo &#39;index&#39;;
          }
          //后置操作方法
          public function _after_index(){
              echo &#39;after&#39;;
          }
       }

    对于任何操作方法我们都可以按照这样的规则来定义前置和后置方法。

    <code><code><code><code><code><code><code><code><code>

    如果当前的操作并没有定义操作方法,而是直接渲染模板文件,那么如果定义了前置 和后置方法的话,依然会生效。真正有模板输出的可能仅仅是当前的操作,前置和后置操作一般情况是没有任何输出的。
    需要注意的是,在有些方法里面使用了exit或者错误输出之类的话 有可能不会再执行后置方法了。
    例如,如果在当前操作里面调用了系统Action的error方法,那么将不会再执行后置操作,但是不影响success方法的后置方法执行。

    <code><code><code><code><code><code><code><code><code>


    11. 跨模块调用

    <code>例如,我们在Index模块调用User模块的操作方法

    1. class IndexAction extends Action{
          public function index(){
              //实例化UserAction
              $User = new UserAction();
              //其他用户操作
               //...
              $this->display(); //输出页面模板
          }
       }

    因为系统会自动加载Action控制器,因此 我们不需要导入UserAction类就可以直接实例化。
    并且为了方便跨模块调用,系统内置了A方法和R方法。    $User = A('User');

    <code>事实上,A方法还支持跨分组或者跨项目调用,默认情况下是调用当前项目下面的模块。<br>跨项目调用的格式是:<br>A('[项目名://][分组名/]模块名')<br>例如:

    1. A(&#39;User&#39;) //表示调用当前项目的User模块
      A(&#39;Admin://User&#39;) //表示调用Admin项目的User模块
      A(&#39;Admin/User&#39;) //表示调用Admin分组的User模块
      A(&#39;Admin://Tool/User&#39;) //表示调用Admin项目Tool分组的User模块


    R方法表示调用一个模块的某个操作方法,调用格式是:
    R('[项目名://][分组名/]模块名/操作名',array('参数1','参数2'…))
    例如:

    1. R(&#39;User/info&#39;) //表示调用当前项目的User模块的info操作方法
      R(&#39;Admin/User/info&#39;) //表示调用Admin分组的User模块的info操作方法
      R(&#39;Admin://Tool/User/info&#39;) //表示调用Admin项目Tool分组的User模块的info操作方法

    R方法还支持对调用的操作方法需要传入参数,例如User模块中我们定义了一个info方法:

    1. class UserAction extends Action{
          protected function info($id){
              $User = M(&#39;User&#39;);
              $User->find($id);
              //...
          }
       }

    接下来,我们可以在其他模块中调用:

    1. R('User/info',array(15))

    表示调用当前项目的User模块的info操作方法,并且id参数传入15



    12. 页面跳转

    <code><code>系统的Action类内置了两个跳转方法success和error,用于页面跳转提示,而且可以支持ajax提交。使用方法很简单,举例如下:

    1. $User = M(&#39;User&#39;); //实例化User对象
      $result = $User->add($data); 
      if($result){
          //设置成功后跳转页面的地址,默认的返回页面是$_SERVER[&#39;HTTP_REFERER&#39;]
          $this->success(&#39;新增成功&#39;, &#39;User/list&#39;);
      } else {
          //错误页面的默认跳转页面是返回前一页,通常不需要设置
          $this->error(&#39;新增失败&#39;);
      }

    Success和error方法都有对应的模板,并且是可以设置的,默认的设置是两个方法对应的模板都是:

    1. //默认错误跳转对应的模板文件
      &#39;TMPL_ACTION_ERROR&#39; => THINK_PATH . &#39;Tpl/dispatch_jump.tpl&#39;;
      //默认成功跳转对应的模板文件
      &#39;TMPL_ACTION_SUCCESS&#39; => THINK_PATH . &#39;Tpl/dispatch_jump.tpl&#39;;

    也可以使用项目内部的模板文件

    1. //默认错误跳转对应的模板文件
      &#39;TMPL_ACTION_ERROR&#39; => &#39;Public:error&#39;;
      //默认成功跳转对应的模板文件
      &#39;TMPL_ACTION_SUCCESS&#39; => &#39;Public:success&#39;;

    模板文件可以使用模板标签,并且可以使用下面的模板变量:

    組態參數
    $msgTitle 操作标题
    $message 页面提示信息
    $status 操作状态 1表示成功 0 表示失败 具体还可以由项目本身定义规则
    $waitSecond 跳转等待时间 单位为秒
    $jumpUrl 跳转页面地址

    success和error方法会自动判断当前请求是否属于Ajax请求,如果属于Ajax请求则会调用ajaxReturn方法返回信息,具体可以参考后面的AJAX返回部分。


    3.1版本开始,error和success方法支持传值,无论是跳转模板方式还是ajax方式 都可以使用assign方式传参。例如:

    1. $this->assign(&#39;var1&#39;,&#39;value1&#39;);
      $this->assign(&#39;var2&#39;,&#39;value2&#39;);
      $this->error(&#39;错误的参数&#39;,&#39;要跳转的URL地址&#39;);

    当正常方式提交的时候,var1和var2变量会赋值到错误模板的模板变量。
    当采用AJAX方式提交的时候,会自动调用ajaxReturn方法传值过去(包括跳转的URL地址url和状态值status)



    13. 重定向

    Action类的redirect方法可以实现页面的重定向功能。
    redirect方法的参数用法和U函数的用法一致(参考上面的URL生成部分),例如:

    1. //重定向到New模块的Category操作
      $this->redirect(&#39;New/category&#39;, array(&#39;cate_id&#39; => 2), 5, &#39;页面跳转中...&#39;);

    上面的用法是停留5秒后跳转到News模块的category操作,并且显示页面跳转中字样,重定向后会改变当前的URL地址。
    如果你仅仅是想重定向要一个指定的URL地址,而不是到某个模块的操作方法,可以直接使用redirect方法重定向,例如:

    1. //重定向到指定的URL地址

    2. redirect('/New/category/cate_id/2', 5, '页面跳转中...')

    Redirect方法的第一个参数是一个URL地址。


    14. 获取系统变量

    1. $this->方法名("变量名",["过滤方法"],["默认值"])

    <code><code><code>方法名可以支持:

    方法名 含义
    _get 获取GET参数
    _post 获取POST参数
    _param 自动判断请求类型获取GET、POST或者PUT参数(3.1新增)
    _request 获取REQUEST 参数
    _put 获取PUT 参数
    _session 获取 $_SESSION 参数


    以上就是ThinkPHP- 31的内容,更多相关内容请关注PHP中文网(www.php.cn)!


    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn