ThinkPHP是一個免費開源的,快速、簡單的面向對象的輕量級PHP開發框架,是爲了敏捷WEB應用開發和簡化企業應用開發而誕生的。ThinkPHP從誕生以來一直秉承簡潔實用的設計原則,在保持出色的性能和至簡的代碼的同時,也注重易用性。遵循Apache2
開源許可協議發佈,意味着能夠無償使用ThinkPHP,甚至容許把基於ThinkPHP開發的應用開源或商業產品發佈/銷售。ThinkPHP5.0版本是一個顛覆和重構版本,採用全新的架構思想,引入了更多的PHP新特性,優化了核心,減小了依賴,實現了真正的惰性加載,支持composer,並針對API開發作了大量的優化,包括路由、日誌、異常、模型、數據庫、模板引擎和驗證等模塊都已經重構,不適合原有3.2項目的升級,但絕對是新項目的首選php
thinkphp5安裝完成後,初始目錄結構以下所示css
www WEB部署目錄(或者子目錄) ├─application 應用目錄 │ ├─common 公共模塊目錄(能夠更改) │ ├─module_name 模塊目錄 │ │ ├─config.php 模塊配置文件 │ │ ├─common.php 模塊函數文件 │ │ ├─controller 控制器目錄 │ │ ├─model 模型目錄 │ │ ├─view 視圖目錄 │ │ └─ ... 更多類庫目錄 │ │ │ ├─command.php 命令行工具配置文件 │ ├─common.php 公共函數文件 │ ├─config.php 公共配置文件 │ ├─route.php 路由配置文件 │ ├─tags.php 應用行爲擴展定義文件 │ └─database.php 數據庫配置文件 │ ├─public WEB目錄(對外訪問目錄) │ ├─index.php 入口文件 │ ├─router.php 快速測試文件 │ └─.htaccess 用於apache的重寫 │ ├─thinkphp 框架系統目錄 │ ├─lang 語言文件目錄 │ ├─library 框架類庫目錄 │ │ ├─think Think類庫包目錄 │ │ └─traits 系統Trait目錄 │ │ │ ├─tpl 系統模板目錄 │ ├─base.php 基礎定義文件 │ ├─console.php 控制檯入口文件 │ ├─convention.php 框架慣例配置文件 │ ├─helper.php 助手函數文件 │ ├─phpunit.xml phpunit配置文件 │ └─start.php 框架入口文件 │ ├─extend 擴展類庫目錄 ├─runtime 應用的運行時目錄(可寫,可定製) ├─vendor 第三方類庫目錄(Composer依賴庫) ├─build.php 自動生成定義文件(參考) ├─composer.json composer 定義文件 ├─LICENSE.txt 受權說明文件 ├─README.md README 文件 ├─think 命令行入口文件
【目錄和文件】html
一、目錄不強制規範,駝峯和小寫+下劃線模式均支持mysql
二、類庫、函數文件統一以.php
爲後綴sql
三、類的文件名均以命名空間定義,而且命名空間的路徑和類庫文件所在路徑一致thinkphp
四、類名和類文件名保持一致,統一採用駝峯法命名(首字母大寫)數據庫
【函數和類、屬性命名】apache
一、類的命名採用駝峯法,而且首字母大寫,例如 User
、UserType
,默認不須要添加後綴,例如UserController
應該直接命名爲User
編程
二、函數的命名使用小寫字母和下劃線(小寫字母開頭)的方式,例如 get_client_ip
json
三、方法的命名使用駝峯法,而且首字母小寫,例如 getUserName
四、屬性的命名使用駝峯法,而且首字母小寫,例如 tableName
、instance
五、以雙下劃線「__」打頭的函數或方法做爲魔法方法,例如 __call
和 __autoload
【常量和配置】
一、常量以大寫字母和下劃線命名,例如 APP_PATH
和 THINK_PATH
二、配置參數以小寫字母和下劃線命名,例如 url_route_on
和url_convert
【數據表和字段】
一、數據表和字段採用小寫加下劃線方式命名,並注意字段名不要如下劃線開頭,例如 think_user
表和 user_name
字段,不建議使用駝峯和中文做爲數據表字段命名
ThinkPHP5.0
應用基於MVC
(模型-視圖-控制器)的方式來組織。下面是一些常見概念
【入口文件】
用戶請求的PHP文件,負責處理一個請求(注意,不必定是URL請求)的生命週期,最多見的入口文件就是index.php
,有時候也會爲了某些特殊的需求而增長新的入口文件,例如給後臺模塊單獨設置的一個入口文件admin.php
或者一個控制器程序入口think
都屬於入口文件
【應用】
應用在ThinkPHP
中是一個管理系統架構及生命週期的對象,由系統的 \think\App
類完成,應用一般在入口文件中被調用和執行,具備相同的應用目錄(APP_PATH
)的應用咱們認爲是同一個應用,但一個應用可能存在多個入口文件。應用具備本身獨立的配置文件、公共(函數)文件
【模塊】
一個典型的應用是由多個模塊組成的,這些模塊一般都是應用目錄下面的一個子目錄,每一個模塊都有本身獨立的配置文件、公共文件和類庫文件
【控制器】
每一個模塊擁有獨立的MVC
類庫及配置文件,一個模塊下面有多個控制器負責響應請求,而每一個控制器其實就是一個獨立的控制器類。
控制器主要負責請求的接收,並調用相關的模型處理,並最終經過視圖輸出。嚴格來講,控制器不該該過多的介入業務邏輯處理
一個典型的Index
控制器類以下:
namespace app\index\controller; class Index { public function index() { return 'hello,thinkphp!'; } }
【操做】
一個控制器包含多個操做(方法),操做方法是一個URL訪問的最小單元。
下面是一個典型的Index
控制器的操做方法定義,包含了兩個操做方法:
namespace app\index\controller; class Index { public function index() { return 'index'; } public function hello($name) { return 'Hello,'.$name; } }
操做方法能夠不使用任何參數,若是定義了一個非可選參數,則該參數必須經過用戶請求傳入,若是是URL請求,則一般是$_GET
或者$_POST
方式傳入
【模型】
模型類一般完成實際的業務邏輯和數據封裝,並返回和格式無關的數據
【視圖】
控制器調用模型類後返回的數據經過視圖組裝成不一樣格式的輸出。視圖根據不一樣的需求,來決定調用模板引擎進行內容解析後輸出仍是直接輸出。
視圖一般會有一系列的模板文件對應不一樣的控制器和操做方法,而且支持動態設置模板目錄
【驅動】
系統不少的組件都採用驅動式設計,從而能夠更靈活的擴展,驅動類的位置默認是放入核心類庫目錄下面,也能夠從新定義驅動類庫的命名空間而改變驅動的文件位置
【行爲】
行爲(Behavior)是在預先定義好的一個應用位置執行的一些操做。相似於AOP
編程中的「切面」的概念,給某一個切面綁定相關行爲就成了一種類AOP
編程的思想。因此,行爲一般是和某個位置相關,行爲的執行時間依賴於綁定到了哪一個位置上。
要執行行爲,首先要在應用程序中進行行爲偵聽,例如:
// 在app_init位置偵聽行爲 \think\Hook::listen('app_init');
而後對某個位置進行行爲綁定:
// 綁定行爲到app_init位置 \think\Hook::add('app_init','\app\index\behavior\Test');
一個位置上若是綁定了多個行爲的,按照綁定的順序依次執行,除非遇到中斷
【命名空間】
ThinkPHP5
採用了PHP
的命名空間進行類庫文件的設計和規劃,而且符合PSR-4
的自動加載規範、
ThinkPHP5.0
版本的默認自帶的入口文件位於public/index.php
(實際部署的時候public
目錄爲應用對外訪問目錄),入口文件內容以下:
// 定義應用目錄 define('APP_PATH', __DIR__ . '/../application/'); // 加載框架引導文件 require __DIR__ . '/../thinkphp/start.php';
這段代碼的做用就是定義應用目錄APP_PATH
和加載ThinkPHP
框架的入口文件,這是全部基於ThinkPHP
開發應用的第一步
官方提供的默認應用的實際目錄結構和說明以下:
├─application 應用目錄(可設置)
│ ├─index 模塊目錄(可更改)
│ │ ├─config.php 模塊配置文件
│ │ ├─common.php 模塊公共文件
│ │ ├─controller 控制器目錄
│ │ ├─model 模型目錄
│ │ └─view 視圖目錄
│ │
│ ├─command.php 命令行工具配置文件
│ ├─common.php 應用公共文件
│ ├─config.php 應用配置文件
│ ├─tags.php 應用行爲擴展定義文件
│ ├─database.php 數據庫配置文件
│ └─route.php 路由配置文件
5.0
版本採用模塊化的設計架構,默認的應用目錄下面只有一個index
模塊目錄,若是要添加新的模塊可使用控制檯命令來生成。
切換到命令行模式下,進入到應用根目錄並執行以下指令:
php think build --module demo
就會生成一個默認的demo模塊,包括以下目錄結構:
├─demo
│ ├─controller 控制器目錄
│ ├─model 模型目錄
│ ├─view 視圖目錄
│ ├─config.php 模塊配置文件
│ └─common.php 模塊公共文件
同時也會生成一個默認的Index
控制器文件
網站的資源文件訪問不會影響正常的操做訪問,只有當訪問的資源文件不存在的時候纔會解析到入口文件,通常就會提示模塊不存在的錯誤。
網站的資源文件通常放入public
目錄的子目錄下面,例以下面是一個建議規範:
public ├─index.php 應用入口文件 ├─static 靜態資源目錄 │ ├─css 樣式目錄 │ ├─js 腳本目錄 │ └─img 圖像目錄
訪問資源文件的URL路徑是:
http://tp5.com/static/css/style.css http://tp5.com/static/js/common.js http://tp5.com/static/img/picture.jpg
若是沒有設置域名綁定,而是使用子目錄方式訪問的話,那麼可能的資源訪問地址是:
http://localhost/public/static/css/style.css http://localhost/public/static/js/common.js http://localhost/public/static/img/picture.jpg
ThinkPHP
支持調試模式,默認狀況下是開啓狀態(5.0.10+
版本開始,默認關閉調試模式,須要本身開啓)。調試模式以除錯方便優先,並且在異常的時候能夠顯示儘量多的信息,因此對性能有必定的影響。
強烈建議開發者在使用ThinkPHP
開發的過程當中使用調試模式,5.0
默認狀況下能夠捕獲到任何細微的錯誤並拋出異常,這樣能夠更好的獲取錯誤提示和避免一些問題和隱患,不要畏懼錯誤,要勇敢面對,並消除隱患。
開發完成後,實際進行項目部署的時候,修改應用配置文件(application/config.php
)中的app_debug
配置參數:
// 關閉調試模式 'app_debug' => false,
找到index
模塊的Index
控制器(文件位於application/index/controller/Index.php
注意大小寫),把Index
控制器類的index
方法修改成Hello,World!
<?php namespace app\index\controller; class Index { public function index() { return 'Hello,World!'; } }
訪問URL地址時,就會看到Hello,World!
的輸出結果
若是要訪問一個駝峯命名的控制器,例如咱們把上面的例子改爲一個HelloWorld
控制器
<?php namespace app\index\controller; class HelloWorld { public function index($name = 'World') { return 'Hello,' . $name . '!'; } }
默認狀況下正確的方法是使用下面的URL進行訪問
http://tp5.com/index.php/index/hello_world
下面的訪問地址是錯誤的
http://tp5.com/index.php/index/HelloWorld
由於默認的URL訪問是不區分大小寫的,所有都會轉換爲小寫的控制器名,除非在應用配置文件中,設置了關閉url自動轉換以下:
'url_convert' => false,
那麼就能夠正常訪問
http://tp5.com/index.php/index/HelloWorld
若是要繼承一個公共的控制器類,可使用:
<?php namespace app\index\controller; use app\index\controller\Base; class Index extends Base { public function index() { return 'Hello,World!'; } }
能夠爲操做方法定義參數,例如:
<?php namespace app\index\controller; class Index { public function index($name = 'World') { return 'Hello,' . $name . '!'; } }
當帶name
參數訪問入口文件地址(例如 http://tp5.com?name=ThinkPHP
)的時候,在瀏覽器中能夠看到以下輸出:
Hello,ThinkPHP!
控制器類能夠包括多個操做方法,但若是操做方法是protected
或者private
類型的話,是沒法直接經過URL訪問到該操做的,也就是說只有public
類型的操做方法纔是能夠經過URL訪問的。
下面來驗證下,把Index
控制器類的方法修改成:
<?php namespace app\index\controller; class Index { public function hello() { return 'hello,thinkphp!'; } public function test() { return '這是一個測試方法!'; } protected function hello2() { return '只是protected方法!'; } private function hello3() { return '這是private方法!'; } }
當咱們訪問以下URL地址的時候,前面兩個是正常訪問,後面兩個則會顯示異常
http://tp5.com/index.php/index/index/hello http://tp5.com/index.php/index/index/test http://tp5.com/index.php/index/index/hello2 http://tp5.com/index.php/index/index/hello3
如今咱們在給控制器添加視圖文件功能,咱們在application/index
目錄下面建立一個view
目錄,而後添加模板文件view/index/hello.html
(注意大小寫),咱們添加模板內容以下:
<html>
<head>
<title>hello {$name}</title>
</head>
<body>
hello, {$name}!
</body>
</html>
要輸出視圖,必須在控制器方法中進行模板渲染輸出操做,如今修改控制器類以下:
<?php namespace app\index\controller; use think\Controller; class Index extends Controller { public function hello($name = 'thinkphp') { $this->assign('name', $name); return $this->fetch(); } }
[注意]若是沒有使用use think\Controller;
就必須使用class Index extends \think\Controller
Index
控制器類繼承了 think\Controller
類以後,咱們能夠直接使用封裝好的assign
和fetch
方法進行模板變量賦值和渲染輸出。
fetch
方法中咱們沒有指定任何模板,因此按照系統默認的規則(視圖目錄/控制器/操做方法)輸出了view/index/hello.html
模板文件。
接下來,咱們在瀏覽器訪問
http://tp5.com/index.php/index/index/hello
輸出:
hello,thinkphp!
在開始以前,咱們首先在數據庫demo
中建立一個think_data
數據表(這裏以mysql
數據庫爲例):
CREATE TABLE IF NOT EXISTS `think_data`( `id` int(8) unsigned NOT NULL AUTO_INCREMENT, `data` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; INSERT INTO `think_data`(`id`,`data`) VALUES (1,'thinkphp'), (2,'php'), (3,'framework');
首先咱們須要在應用的數據庫配置文件application/database.php
中添加數據庫的鏈接信息以下:
return [ // 數據庫類型 'type' => 'mysql', // 服務器地址 'hostname' => '127.0.0.1', // 數據庫名 'database' => 'demo', // 數據庫用戶名 'username' => 'root', // 數據庫密碼 'password' => '', // 數據庫鏈接端口 'hostport' => '', // 數據庫鏈接參數 'params' => [], // 數據庫編碼默認採用utf8 'charset' => 'utf8', // 數據庫表前綴 'prefix' => 'think_', // 數據庫調試模式 'debug' => true, ];
接下來,咱們修改下控制器方法,添加讀取數據的代碼:
<?php namespace app\index\controller; use think\Controller; use think\Db; class Index extends Controller { public function index() { $data = Db::name('data')->find(); $this->assign('result', $data); return $this->fetch(); } }
定義好控制器後,咱們修改模板文件,添加數據輸出標籤以下:
<html> <head> <title></title> </head> <body> {$result.id}--{$result.data} </body> </html>
模板標籤的用法和Smarty
相似,就是用於輸出數據的字段,這裏就表示輸出think_data
表的id
和data
字段的值。
咱們訪問會輸出:
1--thinkphp