ThinkPHP 3.2 內建系統函式

炎藤發表於2015-03-23

前言

ThinkPHP 中本身有一些內建的系統函式,可以直接使用這些函式來加快開發,其系統函式定義,所在位置是:

ThinkPHP/Common/common.php

由於系統函式較多,本篇只做簡單的陳列,後面會分章節詳細講述這些函式的使用; 如果覺得更新太慢,你也可以直接上 ThinkPHP 從官方網站上獲取資訊。

函式列表

以下不完全收錄:

字母函式

單字母行數一般是常用的功能,能處理較多的功能。

函式名稱 函式說明 函式例子
A 函式 例項化控制器
B 函式 執行某個行為
C 函式 用於讀取配置資訊
D 函式 例項化模型
F 函式 快速快取設定和存取
G 函式 除錯統計
I 函式 安全獲取系統輸入變數
L 函式 設定和獲取語言變數
M 函式 例項化模型(無需定義模型類)
N 函式 計數器
R 函式 直接呼叫控制器的操作方法
S 函式 快取設定和存取
U 函式 URL地址生成

其他函式

除了強大的單字母函式以外,還有一些系統輔助函式,也可以幫助你方便開發。

函式名稱 函式說明 函式例子
cookie 函式 Cookie 操作
import 函式 類庫匯入
session 函式 Session 操作
tag 函式 處理標籤擴充套件 專案開始標籤的呼叫,tag('app_begin');

參考資料

官方函式列表: http://www.thinkphp.cn/info/309.html
第三方整理: http://www.zzbaike.com/wiki/ThinkPHP-函式參考-系統函式庫

[稿] ThinkPHP 系統函式: I 函式詳解

正如你所見到的一樣,I方法是ThinkPHP眾多單字母函式中的新成員,其命名來自於英文Input(輸入),主要用於更加方便和安全的獲取系統輸入變數,可以用於任何地方,用法格式如下:

I('變數型別.變數名',['預設值'],['過濾方法'])

變數型別是指請求方式或者輸入型別,包括:

變數型別    含義
get    獲取GET引數
post    獲取POST引數
param    自動判斷請求型別獲取GET、POST或者PUT引數
request    獲取REQUEST 引數
put    獲取PUT 引數
session    獲取 $_SESSION 引數
cookie    獲取 $_COOKIE 引數
server    獲取 $_SERVER 引數
globals    獲取 $GLOBALS引數

注意:變數型別不區分大小寫。

變數名則嚴格區分大小寫。 預設值和過濾方法均屬於可選引數。

用法

我們以GET變數型別為例,說明下I方法的使用:

echo I('get.id'); // 相當於 $_GET['id']
echo I('get.name'); // 相當於 $_GET['name']

支援預設值:

echo I('get.id',0); // 如果不存在$_GET['id'] 則返回0
echo I('get.name',''); // 如果不存在$_GET['name'] 則返回空字串

採用方法過濾:

echo I('get.name','','htmlspecialchars'); // 採用htmlspecialchars方法對$_GET['name'] 進行過濾,如果不存在則返回空字串

支援直接獲取整個變數型別,例如:

I('get.'); // 獲取整個$_GET 陣列

用同樣的方式,我們可以獲取post或者其他輸入型別的變數,例如:

I('post.name','','htmlspecialchars'); // 採用htmlspecialchars方法對$_POST['name'] 進行過濾,如果不存在則返回空字串
I('session.user_id',0); // 獲取$_SESSION['user_id'] 如果不存在則預設為0
I('cookie.'); // 獲取整個 $_COOKIE 陣列
I('server.REQUEST_METHOD'); // 獲取 $_SERVER['REQUEST_METHOD'] 

param變數型別是框架特有的支援自動判斷當前請求型別的變數獲取方式,例如:

echo I('param.id'); 

如果當前請求型別是GET,那麼等效於 $_GET['id'],如果當前請求型別是POST或者PUT,那麼相當於獲取 $_POST['id'] 或者 PUT引數id。 並且param型別變數還可以用數字索引的方式獲取URL引數(必須是PATHINFO模式引數有效,無論是GET還是POST方式都有效),例如: 當前訪問URL地址是

http://serverName/index.php/New/2013/06/01

那麼在 ThinkPHP 3.1 中我們可以通過

echo I('param.1'); // 輸出2013
echo I('param.2'); // 輸出06
echo I('param.3'); // 輸出01

在 ThinkPHP 3.2 中應該通過這樣方式來獲取

echo I('path.1'); // 輸出2013
echo I('path.2'); // 輸出06    
echo I('path.3'); // 輸出01

事實上,param變數型別的寫法可以簡化為:

I('id'); // 等同於 I('param.id')
I('name'); // 等同於 I('param.name')

變數過濾

使用I方法的時候 變數其實經過了兩道過濾,首先是全域性的過濾,全域性過濾是通過配置VAR_FILTERS引數,這裡一定要注意,3.1版本之後,VAR_FILTERS引數的過濾機制已經更改為採用array_walk_recursive方法遞迴過濾了,主要對過濾方法的要求是必須引用返回,所以這裡設定htmlspecialchars是無效的,你可以自定義一個方法,例如:

function filter_default(&$value){
    $value = htmlspecialchars($value);
}

然後配置:

'VAR_FILTERS'=>'filter_default'

如果需要進行多次過濾,可以用:

'VAR_FILTERS'=>'filter_default,filter_exp'

filter_exp方法是框架內建的安全過濾方法,用於防止利用模型的EXP功能進行注入攻擊。

因為VAR_FILTERS引數設定的是全域性過濾機制,而且採用的是遞迴過濾,對效率有所影響,所以,我們更建議直接對獲取變數過濾的方式,除了在I方法的第三個引數設定過濾方法外,還可以採用配置DEFAULT_FILTER引數的方式設定過濾,事實上,該引數的預設設定是:

'DEFAULT_FILTER'        => 'htmlspecialchars'

也就說,I方法的所有獲取變數都會進行htmlspecialchars過濾,那麼:

I('get.name'); // 等同於 htmlspecialchars($_GET['name'])

同樣,該引數也可以支援多個過濾,例如:

'DEFAULT_FILTER'        => 'strip_tags,htmlspecialchars'
I('get.name'); // 等同於 htmlspecialchars(strip_tags($_GET['name']))

如果我們在使用I方法的時候 指定了過濾方法,那麼就會忽略DEFAULT_FILTER的設定,例如:

echo I('get.name','','strip_tags'); // 等同於 strip_tags($_GET['name'])

I方法的第三個引數如果傳入函式名,則表示呼叫該函式對變數進行過濾並返回(在變數是陣列的情況下自動使用array_map進行過濾處理),否則會呼叫PHP內建的filter_var方法進行過濾處理,例如:

I('post.email','',FILTER_VALIDATE_EMAIL);

表示 會對$_POST['email'] 進行 格式驗證,如果不符合要求的話,返回空字串。 (關於更多的驗證格式,可以參考 官方手冊的filter_var用法。) 或者可以用下面的字元標識方式:

I('post.email','','email');

可以支援的過濾名稱必須是filter_list方法中的有效值(不同的伺服器環境可能有所不同),可能支援的包括:

  • int
  • boolean
  • float
  • validate_regexp
  • validate_url
  • validate_email
  • validate_ip
  • string
  • stripped
  • encoded
  • special_chars
  • unsafe_raw
  • email
  • url
  • number_int
  • number_float
  • magic_quotes
  • callback

在有些特殊的情況下,我們不希望進行任何過濾,即使DEFAULT_FILTER已經有所設定,可以使用: I('get.name','',NULL);

一旦過濾引數設定為NULL,即表示不再進行任何的過濾。

相關文章