ThinkPHP3.1.3版本有一些特性,還是值得關注的,下面來簡單說下。
1、異常方面的改進
新版的ThinkPHP3.1.3重寫了異常類ThinkException(其實是完全簡化成了直接繼承系統Exception類),并且把異常邏輯改進封裝到Think類中。主要涉及到Think類的appException方法和halt函數。
并且改進后的異常處理支持系統致命錯誤的捕獲,Think類增加了fatalError方法,原理是使用了
1
|
register_shutdown_function( array ( 'Think' , 'fatalError' )); |
因此可以使得系統致命錯誤通過統一的異常模板界面友好提示。
2、對PDO參數綁定的支持
因為ThinkPHP3.*版本采用的是混合數據庫驅動,同時也支持PDO方式,但之前版本并未針對PDO做優化,只是簡單的封裝。3.1.3版本完善了對PDO以及Sqlarv的支持,因為PDO和sqlsrv都支持參數綁定操作(注意,不支持參數綁定的數據庫和驅動無法使用參數綁定功能)。
系統對參數綁定操作的支持分兩種:自動綁定和手動綁定。
自動綁定是對于寫入操作(這里包括數據的新增和更新),框架會自動把相關數據轉換成參數綁定方式執行,這個部分不需要額外處理,因為sqlsrv只有采用參數綁定的方式傳值才能支持UTF8數據寫入,但是每次寫入數據都要采用手動參數綁定的話,就會顯得比較麻煩。為了避免和手動參數綁定沖突,自動參數綁定采用的是對字段名md5編碼的方式。
手動綁定,通常用于查詢條件之類的,并且采用bind連貫操作方法,例如:
1
|
$model ->where( array ( 'id' => ':id' , 'name' => ':name' ))->bind( array ( ':id' => $id , ':name' => $name ))->select(); |
3、增加變量安全獲取方法
之前版本通過Action類的_post _get等方法來安全獲取變量,雖然沒問題,但局限是只能在控制器中獲取變量,新版把這一功能獨立成一個快捷方法I,可以用于任何地方。
使用方法如下:
1
2
3
4
5
|
I( 'get.id' ,0); // 獲取$_GET['id'] 如果不存在則默認為0 I( 'post.name' , '' , 'htmlspecialchars' ); // 獲取$_POST['name'] 采用htmlspecialchars方法過濾 I( 'id' ); // 獲取id參數 自動判斷get或者post I( 'param.id' ); // 獲取id參數 自動判斷get或者post 和上面用法等效 I( 'put.id' ); // 獲取put請求的id參數 |
還支持獲取整個數組,例如:
1
2
|
I( 'get.' ); // 獲取$_GET數組 I( 'post.' ); // 獲取$_POST數組 |
在使用I方法的情況下,系統的VAR_FILTERS和DEFAULT_FILTER過濾配置依然有效。
4、where方法的多次調用
模型類的where方法可以支持數組方式的多次調用,例如:
1
|
$model ->where( array ( 'a' =>1, 'c' =>2))->where( array ( 'a' =>3, 'b' =>1))->select(); |
多個where條件的時候,后面的條件會合并到前面的條件,最終的條件等效于:
1
|
$model ->where( array ( 'a' =>3, 'b' =>1, 'c' =>2))->select(); |
5、控制器中的assign方法支持連貫操作
我們可以在控制器使用:
1
|
$this ->assign( 'name' , $name )->assign( 'email' , $email )->display(); |
或者:
1
|
$this ->assign( array ( 'name' => $name , 'email' => $email ))->display(); |