ThinkPHP源碼學習之I方法

來源:互聯網
上載者:User
PHP新人一個,最近在做一個項目,用的是ThinkPHP,想往深處學習,特意學習ThinkPHP的源碼並作筆記,以記錄這些容易忘記的東西,廢話不多說,開始。

官網說明:

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

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

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

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

注意:變數類型不區分大小寫。
變數名則嚴格區分大小寫。
預設值和過濾方法均屬於選擇性參數。

官方的代碼如下:

function I($name,$default='',$filter=null,$datas=null) {
static $_PUT=null;//使用static定義了一個靜態,聲明類成員或方法為static,就可以不執行個體化類而直接存取。不能通過一個對象來訪問其中的靜態成員(靜態方法除外)
if(strpos($name,'/')){ // 指定修飾符 strpos()函數為尋找字串在另一個字串中第一次出現的位置,尋找‘/'在參數nam中第一次出現的位置
list($name,$type) =explode('/',$name,2);//explode(separator,string,limit)函數意義為根據特定字元將字串打撒為數組,limit為返回的數組的個數
}elseif(C('VAR_AUTO_STRING')){ // 預設強制轉換為字串 //調用了ThinkPHP的C方法
$type = 's';
}

//小結 此if含義為判斷參數是否帶有/
if(strpos($name,'.')) { // 指定參數來源 //查看是否帶.!
list($method,$name) = explode('.',$name,2);
}else{ // 預設為自動判斷
$method = 'param';
}
switch(strtolower($method)) { //strtolower()把所有字元轉換為小寫 利用switch來定位方法的類型
case 'get' :
$input =& $_GET;
break;
case 'post' :
$input =& $_POST;
break;
case 'put' :
if(is_null($_PUT)){
parse_str(file_get_contents('php://input'), $_PUT);
}
$input =$_PUT;
break;
case 'param' :
switch($_SERVER['REQUEST_METHOD']) { //$_SERVER['REQUEST_METHOD' 擷取請求的方法 利用擷取到的方法名,使用swith()來定位方法的類型,此處思想為遞迴
case 'POST':
$input = $_POST;
break;
case 'PUT':
if(is_null($_PUT)){
parse_str(file_get_contents('php://input'), $_PUT);
}
$input =$_PUT;
break;
default:
$input = $_GET;
}
break;
case 'path' :
$input = array();
if(!empty($_SERVER['PATH_INFO'])){
$depr = C('URL_PATHINFO_DEPR');
$input = explode($depr,trim($_SERVER['PATH_INFO'],$depr));
}
break;
case 'request' :
$input =& $_REQUEST;
break;
case 'session' :
$input =& $_SESSION;
break;
case 'cookie' :
$input =& $_COOKIE;
break;
case 'server' :
$input =& $_SERVER;
break;
case 'globals' :
$input =& $GLOBALS;
break;
case 'data' :
$input =& $datas;
break;
default:
return null;
}
if(''==$name) { // 擷取全部變數
$data = $input;
$filters = isset($filter)?$filter:C('DEFAULT_FILTER');//使用了三目運算子 isset()函數 一般用來檢測變數是否設定,empty()用來判斷是否為空白
if($filters) {
if(is_string($filters)){
$filters = explode(',',$filters);
}
foreach($filters as $filter){
$data = array_map_recursive($filter,$data); // ThinkPHP的參數過濾方法array_map_recursive foreach()為迴圈函數
}
}
}elseif(isset($input[$name])) { // 取值操作
$data = $input[$name];
$filters = isset($filter)?$filter:C('DEFAULT_FILTER');
if($filters) {
if(is_string($filters)){
if(0 === strpos($filters,'/')){
if(1 !== preg_match($filters,(string)$data)){ //preg_match()用來匹配Regex
// 支援正則驗證
return isset($default) ? $default : null;
}
}else{
$filters = explode(',',$filters);
}
}elseif(is_int($filters)){
$filters = array($filters);
}

if(is_array($filters)){
foreach($filters as $filter){
if(function_exists($filter)) {
$data = is_array($data) ? array_map_recursive($filter,$data) : $filter($data); // 參數過濾
}else{
$data = filter_var($data,is_int($filter) ? $filter : filter_id($filter));
if(false === $data) {
return isset($default) ? $default : null;
}
}
}
}
}
if(!empty($type)){//使用switch判斷type的類型
switch(strtolower($type)){
case 'a':// 數組
$data =(array)$data;
break;
case 'd':// 數字
$data =(int)$data;
break;
case 'f':// 浮點
$data =(float)$data;
break;
case 'b':// 布爾
$data =(boolean)$data;
break;
case 's': // 字串
default:
$data = (string)$data;
}
}
}else{ // 變數預設值
$data = isset($default)?$default:null;
}
is_array($data) && array_walk_recursive($data,'think_filter');
return $data;
}

I方法主要是用來擷取前台傳給背景值,方法定義了四個參數,只有一個是必須的,此參數為所要擷取的名稱,其他都是可以變的。

以上標紅的便是自己看代碼過程中的記得一些知識點。

功能:安全的擷取input傳過來的參數

實現思路:

如果提交的時候跟上了類型,則按指定的類型處理,如果沒有跟上指定類型,則根據伺服器變數來確定類型。

通過過濾來確保提交的資料的安全性。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

以上就介紹了ThinkPHP源碼學習之I方法,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.