Thinkphp各個版本總結:tp3.2.3,tp5.0,tp5.1差別php
終得閒暇時間(也就兩三個小時)可以進行這6個月對tp框架的使用總結了:css
1.框架隱藏模塊差別:laravel
tp3.2.3:其實還比較麻煩web
//隱藏入口文件 在與入口文件同級目錄,將.htaccess文件中 RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 修改成 RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L] //配置設置默認模塊訪問模塊 ‘DEFAULT_MODULE’=> 'Home'(Home爲模塊名稱), //隱藏模塊,關閉多模塊訪問 ‘MULTI_MODULE’=> false, //改變URL模式爲重寫模式 'URL_MODEL' => 2, (注意要隱藏哪一個模塊在哪一個模塊下的配置文件下配置,不然關閉多模塊訪問會出現其餘模塊不能被訪問) //在公共的配置文件配置,多模塊訪問 'MODULE_ALLOW_LIST' => array( '模塊名稱1','模塊名稱2','模塊名稱3'),
tp5:能夠看見其中穩了隱藏url中的模塊名咱們須要進行設置的是一個BIND_MOULE常量thinkphp
define('APP_PATH', __DIR__ . '/../application/'); define('BIND_MODULE','home'); // define('CONTROLLER_NAME',\think\Request::instance()->controller()); // 加載框架引導文件 require __DIR__ . '/../thinkphp/start.php';
tp5.1:隱藏模塊名所須要的是利用Container中的鏈式方法進行bind方法中的綁定模塊數據庫
namespace think; // 加載基礎文件 require __DIR__ . '/../thinkphp/base.php'; // 支持事先使用靜態方法設置Request對象和Config對象 // 執行應用並響應(5.1在此用bind實現隱藏模塊名) Container::get('app')->bind('index')->run()->send();
2.模板主題的設置json
思路是說手機端和電腦端在base的控制器中區別以後改變配置的模板路徑瀏覽器
tp3.2.3(極爲簡單):此刻你的$this->display();路徑就是對應的moule/view/m/ 下的路徑了緩存
if (is_mobile()) { //設置默認主題爲 m C('DEFAULT_THEME','m'); }
tp5及以上:模板主題的思路是自動適配view的路徑php框架
//模板主題的切換(適配各個平臺以及雙端) $theme = Env::get('module_path').'view/'.(get_platform()).'/'.(is_mobile()?'m/':'web/'); $this->view->config('view_path',$theme);
3.助手函數的升級(字母函數的升級)
tp3.2.3:很明顯你們都知道有所謂的字母函數能夠進行使用,可是其實好用歸好用,違反了許多代碼的規範和習慣
tp5以上因爲我公司統一優先級是助手函數優先因此我也發掘了一些助手函數的差別:
3.2 版本 |
5.0 版本 |
---|---|
C | config |
E | exception |
G | debug |
L | lang |
T | 廢除 |
I | input |
N | 廢除 |
D | model |
M | db |
A | controller |
R | action |
B | 廢除 |
U | url |
W | widget |
S | cache |
F | 廢除 |
tp5.1以上:
助手函數 描述 abort 中斷執行併發送HTTP狀態碼 action 調用控制器類的操做 app 快速獲取容器中的實例 支持依賴注入 behavior 執行某個行爲 bind 快速綁定對象實例 cache 緩存管理 call 調用反射執行callable 支持依賴注入 class_basename 獲取類名(不包含命名空間) class_uses_recursive 獲取一個類裏全部用到的trait config 獲取和設置配置參數 container 獲取容器對象實例 controller 實例化控制器 cookie Cookie管理 db 實例化數據庫類 debug 調試時間和內存佔用 dump 瀏覽器友好的變量輸出 env 獲取環境變量(V5.1.3+) exception 拋出異常處理 halt 變量調試輸出並中斷執行 input 獲取輸入數據 支持默認值和過濾 json JSON數據輸出 jsonp JSONP數據輸出 lang 獲取語言變量值 model 實例化Model parse_name 字符串命名風格轉換 redirect 重定向輸出 request 實例化Request對象 response 實例化Response對象 route 註冊路由規則(V5.1.3+) session Session管理 token 生成表單令牌輸出 trace 記錄日誌信息 trait_uses_recursive 獲取一個trait裏全部引用到的trait url Url生成 validate 實例化驗證器 view 渲染模板輸出 widget 渲染輸出Widget xml XML數據輸出
其中要重點說的是request()這個助手函數!:
tp3.2.3的CONTROLLER_NAME和ACTION_NAME在tp5以上都已經進行了廢除 tp5以上的獲取方法: requset()->controller(); request()->action(); 固然別忘了在模板裏面要 {:requset()->controller()} {:requset()->action()} 固然還有的就是Request類的use: tp5.0版本: use think\Request; tp5.1版本: use think\facade\Env; 而後就是 Request::isAjax() Request::isGet() Request::isPost()... 助手函數: request()->isGet() request()->isPost() request()->isAjax()
其中不少tp5.0只要use以後就能使用的類靜態調用方式在tp5.1你發現不行
此時你須要查看手冊中這個類是否是有facade,有得話就在think\後加上facade\,有的話你就加上去吧。
其中5.1某些版本中$_SERVER這類變量沒法使用:此時就須要use think\facade\Request;就可以恢復使用。
4.目錄結構得變化
tp3.2.3入口直接就在根目錄當中,而tp5以上都在public這個文件夾當中
配置文件tp3.2.3分得不是那麼詳細:分爲Common中的主配之以及各個模塊中的分配置,配置衝突時分配置優先級高!
tp5.0:
tp5.1更爲細化的配置:
配置當中5以後被分爲各類配置不像3.2.3在同一個config.php文件當中。如今區分爲app,cache,databases,template(模板)這幾個配置;
不一樣於3.2.3當中的__PUBLIC__這些都被取消了,可是咱們能夠在配置template文件中進行設置: // 視圖輸出字符串內容替換 'tpl_replace_string' => [ '__STATIC__'=>'/static/common/js', //或者 // '__ADDONS__' =>'/static/'.(get_platform()).'/index/Addons', '__IMG__' =>'/static/'.(get_platform()).'_'.(is_mobile()?'m':'pc').'/images', '__CSS__' =>'/static/'.(get_platform()).'_'.(is_mobile()?'m':'pc').'/css', '__JS__' =>'/static/'.(get_platform()).'_'.(is_mobile()?'m':'pc').'/js', '__ROOT__'=> '', '__UPLOADS__' => '/uploads', '__PUBLIC__' => '/static/'.(get_platform()).'_'.(is_mobile()?'m':'pc'), ],
5.模板差別
a.標籤開頭和結尾<和>改成{和}後會有很大的問題存在,問題在於{}咱們也用來了調用助手函數以及輸出一些變量數據等。例如一下的衝突狀況:
{include file="Public/header" title="{$appInfo.title}_{:config('WEB_SITE_TITLE')}" description="{$appInfo.description}" keywords="{$appInfo.keywords}" cate="哈哈"/} 其中模板規定了助手函數使用: {:助手函數()} 可是咱們的include內置標籤的'{'會去找他最近的一個'}',他找到的是config這個助手函數的 "}"因此從description開始以後所有變爲標籤外的數據。 一般解決辦法就是將助手函數的使用放置於C層當中,而後傳變量進來。 包含文件以後能夠經過以上的方式進行注入參數,而後被包含的文件就能夠是這樣子的: <meta name="keywords" content="[keywords]"> <meta name="description" content="[description]">
b.tp5.1以後的 if標籤和foreach標籤產生了改變
tp3.2.3以及tp5.0(依舊使用尖括號講解) <if condition="$times eq 1"> <foreach name='nav2' item='v'> tp5.1:純原生 <if (!empty($tempType)) && $tempType == "index" > <foreach $ziwei['data'] as $k=>$v>
c.視圖渲染
tp3.2.3:$this->display();這個相信你們都會用 tp5.0以上: 1.return $this->fetch(); 2.助手函數view的使用: return view('hello', ['name' => 'thinkphp']);
d.
6.開發規範(報找不到控制器,找不到方法之類的錯誤,其實官方手冊已經足夠詳細了,但願開發以前首先拜讀一番!)
目錄和文件 目錄使用小寫+下劃線; 類庫、函數文件統一以.php爲後綴; 類的文件名均以命名空間定義,而且命名空間的路徑和類庫文件所在路徑一致; 類文件採用駝峯法命名(首字母大寫),其它文件採用小寫+下劃線命名; 類名和類文件名保持一致,統一採用駝峯法命名(首字母大寫); 函數和類、屬性命名 類的命名採用駝峯法(首字母大寫),例如 User、UserType,默認不須要添加後綴,例如UserController應該直接命名爲User; 函數的命名使用小寫字母和下劃線(小寫字母開頭)的方式,例如 get_client_ip; 方法的命名使用駝峯法(首字母小寫),例如 getUserName; 屬性的命名使用駝峯法(首字母小寫),例如 tableName、instance; 特例:以雙下劃線__打頭的函數或方法做爲魔術方法,例如 __call 和 __autoload;
7.自定義的類庫vendor(類庫載入)
tp3.2.3的路徑是/ThinkPHP/Library/Vendor;而後引用的時候是直接採用助手函數vendor()進行使用
vendor('xunsearch.lib.XS'); $xs = new \XS('art');
tp5.0使用的是/vendor路徑,可是採用的是import進行載入使用(我真的喜歡這種方法):
Loader::import('first.second.Foo'); $foo = new \Foo();
tp5.1使用的是/vendor路徑,可是廢除了import這一個神器,直接就是隻能required去包含這個文件:
一般配合着env('vendor_path')去獲取路徑進行包含
use think\facade\Env; // 設置支付請求訂單參數 require_once(Env::get('extend_path') . 'linxun/paychannel/Alipay/wappay/buildermodel/AlipayTradeWapPayContentBuilder.php'); $payRequestBuilder = new \AlipayTradeWapPayContentBuilder(); 固然能夠採用助手函數env()
8.W函數 / widget函數的妙用
這個函數實際上是一個很是好用的小玩意兒,他能夠在任何地方讓你去調用相關邏輯層的東西,講俗一點一個隨時能夠調用的C層同樣的東西。
首先咱們定義它:
namespace app\index\widget; use think\Action; use think\Controller; /** * 分類widget * 用於動態調用分類信息 */ class Applist extends Controller { /* 顯示指定分類的同級分類或子分類列表 */ public function lists($groupid=0,$limit=10) { $apps = db('appinfo')->where('groupid',$groupid)->limit($limit)->select(); $this->assign('apps', $apps); return $this->fetch('List/subnav'); } }
其次咱們在模板中調用它
<div class="subnav"> <ul> {:widget('Applist/lists', ['groupid'=>$appInfo['groupid'],'limit'=>30])} </ul> </div>
這樣咱們甚至能夠將Applist類中lists方法渲染的視圖直接抽取過來。
9.composer
對於不瞭解composer的必定最好使用tp框架的同時必定要學會使用composer進行類庫的加載,博主的另一票composer的打包可讓你徹底走入composer的世界:
Composer包製做以及發佈!連接以下:
https://blog.csdn.net/HoeWang/article/details/82421061
10.總結
tp的各個版本差別仍是有不少,可是其餘的都大部分手冊一查就可以完美解決了。對於tp框架呢,官方的謾罵也有,可是通過了長時間的使用,我發現其實做爲一個輕量級別的框架,尤爲5.0以後打的接口話的架構其實thinkphp框架仍是很是不錯的。可是也見的有人無腦噴,tp自己輕量級且快於laravel,對於國內的開發者能夠說是最爲友好都沒有之一的php開發框架了。總體來講對我來講算是一把不算神兵利器的慣手中等武器吧。其餘tp的底層我也改過,特別好改,且不容易形成靈異衝突,因此對於初中級的php這算是一門必須的php框架吧!