Thinkphp各個版本總結:tp3.2.3,tp5.0,tp5.1差異
終得閑暇時間(也就兩三個小時)能夠進行這6個月對tp框架的使用總結了:
1.框架隱藏模塊差異:
tp3.2.3:其實還比較麻煩
//隱藏入口文件
在與入口文件同級目錄,將.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常量
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.模板主題的設置
思路是說手機端和電腦端在base的控制器中區別之后改變配置的模板路徑
tp3.2.3(極為簡單):此刻你的$this->display();路徑就是對應的moule/view/m/ 下的路徑了
if (is_mobile()) {
//設置默認主題為 m
C('DEFAULT_THEME','m');
}
tp5及以上:模板主題的思路是自動適配view的路徑
//模板主題的切換(適配各個平台以及雙端)
$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框架吧!
