ThinkPHP源码学习之I方法
PHP新人一個,最近在做一個項目,用的是ThinkPHP,想往深處學(xué)習(xí),特意學(xué)習(xí)ThinkPHP的源碼并作筆記,以記錄這些容易忘記的東西,廢話不多說,開始。
官網(wǎng)說明:
I方法是ThinkPHP眾多單字母函數(shù)中的新成員,其命名來自于英文Input(輸入),主要用于更加方便和安全的獲取系統(tǒng)輸入變量,可以用于任何地方,用法格式如下:
I('變量類型.變量名',['默認值'],['過濾方法'])
變量類型是指請求方式或者輸入類型,包括:
get | 獲取GET參數(shù) |
post | 獲取POST參數(shù) |
param | 自動判斷請求類型獲取GET、POST或者PUT參數(shù) |
request | 獲取REQUEST 參數(shù) |
put | 獲取PUT 參數(shù) |
session | 獲取 $_SESSION 參數(shù) |
cookie | 獲取 $_COOKIE 參數(shù) |
server | 獲取 $_SERVER 參數(shù) |
globals | 獲取 $GLOBALS參數(shù) |
注意:變量類型不區(qū)分大小寫。
變量名則嚴(yán)格區(qū)分大小寫。
默認值和過濾方法均屬于可選參數(shù)。
function I($name,$default='',$filter=null,$datas=null) {
static $_PUT = null;//使用static定義了一個靜態(tài),聲明類成員或方法為static,就可以不實例化類而直接訪問。不能通過一個對象來訪問其中的靜態(tài)成員(靜態(tài)方法除外)
if(strpos($name,'/')){ // 指定修飾符?strpos()函數(shù)為查找字符串在另一個字符串中第一次出現(xiàn)的位置,查找‘/'在參數(shù)nam中第一次出現(xiàn)的位置
list($name,$type) = explode('/',$name,2);//explode(separator,string,limit)函數(shù)意義為根據(jù)特定字符將字符串打撒為數(shù)組,limit為返回的數(shù)組的個數(shù)
}elseif(C('VAR_AUTO_STRING')){ // 默認強制轉(zhuǎn)換為字符串 //調(diào)用了ThinkPHP的C方法
? ? ? ? $type ? = ? 's';
? ? }
//小結(jié) ?此if含義為判斷參數(shù)是否帶有/
? ? if(strpos($name,'.')) { // 指定參數(shù)來源 //查看是否帶.!
? ? ? ? list($method,$name) = ? explode('.',$name,2);
? ? }else{ // 默認為自動判斷
? ? ? ? $method = ? 'param';
? ? }
? ? switch(strtolower($method)) { ?//strtolower()把所有字符轉(zhuǎn)換為小寫 利用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()函數(shù) 一般用來檢測變量是否設(shè)置,empty()用來判斷是否為空
? ? ? ? if($filters) {
? ? ? ? ? ? if(is_string($filters)){
? ? ? ? ? ? ? ? $filters ? ?= ? explode(',',$filters);
? ? ? ? ? ? }
? ? ? ? ? ? foreach($filters as $filter){
? ? ? ? ? ? ? ? $data ? = ? array_map_recursive($filter,$data); // ThinkPHP的參數(shù)過濾方法array_map_recursive?foreach()為循環(huán)函數(shù)
? ? ? ? ? ? }
? ? ? ? }
? ? }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()用來匹配正則表達式
? ? ? ? ? ? ? ? ? ? ? ? // 支持正則驗證
? ? ? ? ? ? ? ? ? ? ? ? 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); // 參數(shù)過濾
? ? ? ? ? ? ? ? ? ? }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': // 數(shù)組
? ? ? ? $data = (array)$data;
? ? ? ? break;
? ? ? ? case 'd': // 數(shù)字
? ? ? ? $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方法主要是用來獲取前臺傳給后臺的值,方法定義了四個參數(shù),只有一個是必須的,此參數(shù)為所要獲取的名稱,其他都是可以變的。
以上標(biāo)紅的便是自己看代碼過程中的記得一些知識點。
功能:安全的獲取input傳過來的參數(shù)
實現(xiàn)思路:
如果提交的時候跟上了類型,則按指定的類型處理,如果沒有跟上指定類型,則根據(jù)服務(wù)器變量來確定類型。
通過過濾來確保提交的數(shù)據(jù)的安全性。
總結(jié)
以上是生活随笔為你收集整理的ThinkPHP源码学习之I方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: 微信JSAPI之V3版本支付踩坑
- 下一篇: 计算机行业研究及2020年策略:聚焦主赛