1. 程式人生 > >Thinkphp各個版本總結------終結版本!

Thinkphp各個版本總結------終結版本!

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框架吧!