tp中的M,D,C,A,I,S方法
M方法
//使用M方法例項化
$User = M('User');
//和用法$User = new \Think\Model ('User');等效
//執行其他的資料操作
$User->select();
- 1
- 2
- 3
- 4
- 5
M 方法也支援垮庫操作.
//使用M方法例項化,操作db_name中的ot_user表
$User = M('db_name.User','ot_');
//執行其他的資料庫操作
$User->select();
- 1
- 2
- 3
- 4
M方法的引數和\Think\Model的引數是一樣的,所以我們可以這樣操作:
$New = M('new','think_',$connection);
//等效於$New = new \Think\Model('new','think_',$connection);
- 1
- 2
M方法例項化的時候.預設的是直接例項化\Think\Model類,如果要例項化其他的公共模型類,可以使用下面:
$User = M('\Home\Model\CommonModel:User','think_','db_config');
相當於$User = new \Home\Model\CommonModel('User','think_','db_config');
- 1
- 2
例項化基礎模型類(Model)
在沒有定義任何模型的時候,可以使用下面的操作.這種方法簡單高效,但是缺點就是沒有自定義的模型類,無法寫入相關的業務邏輯.只能完成基本的CURD操作.如果你的模型類中有自己的業務邏輯,是無法使用M方法的.
//例項化User模型
$User = new Model('User');
//或者使用M()快捷方法例項化,和上面的方法是等效的
$User = M('User');
//執行其他的資料操作
$User->select();
- 1
- 2
- 3
- 4
- 5
- 6
例項化其他模型類
- 第一種因為沒有模型類的定義,很難封裝一些額外的邏輯方法.如果只是需要擴充套件一些通用的邏輯,可以嘗試下面方法
$User = new CommonModel('User');
- 1
- 模型的例項化方法有三個引數,第一個引數是模型名稱,第二個引數用於設定資料表的字首(留空則取當前專案配置的表字首),第三個引數用於設定當前使用的資料庫連線資訊(留空則取當前專案配置的資料庫連線資訊).
$User = new CommonModel('User','think_','db_config');
- 1
- 第三個使用M方法
$User = M('CommonModel:User','think_','db_config');
- 1
M方法預設是例項化model類
D方法
D方法例項化模型類的時候通常是例項化某個具體的模型類,如果僅僅是對資料表進行基本的CURD操作的話,可以使用M方法.由於不要載入具體的模型類,所以效能會更好.如果D方法沒有找到定義的模型類,則會自動呼叫M方法.<?php
//例項化模型
$User = D('User');
//相當於$User = new \Home\Model\UserModel();
//執行操作
$User -> select();
- 1
- 2
- 3
- 4
- 5
- 6
如果Home\Model\UserModel不存在的話,就會嘗試例項化公共模型下的\Common\Model\UserModel類.
D方法的引數就是例項的名稱.並且和模型類的大小寫定義是一致的.
引數 | 例項化的模型檔案(假設當前模組為Home) |
---|---|
User | 對應的模型類檔案的 \Home\Model\UserModel.class.php |
UserType | 對應的模型類檔案的 \Home\Model\UserTypeModel.class.php |
如果在Liunx下,要注意大小寫
D方法可以自動檢測模型類,如果存在自定義的模型類,則例項化自定義模型類,如果不存在,則會例項化系統的\Think\Model基類,同時對於已例項化過的模型,不會重複去例項化。
//D方法還可以跨模組呼叫,需要使用
//例項化Admin的User模型
D('Admin/User');
//例項化Extend擴充套件名稱空間下的Info模型
D('Extend://Editor/Info'):
- 1
- 2
- 3
- 4
- 5
注意:跨模組例項化模型類的時候,不支援自動載入公共模組的模型類。
C方法
定義了配置檔案之後,可以使用系統提供的C方法來讀取已有額配置.
- 獲取已經設定的引數值:C(‘引數名稱’)
$model = C('URL_MODEL');//不區分大小寫=url_model
- 1
but 大寫是比較規範的.
注意:配置引數名稱中不能含有”.”和特殊字元
如果URL_MODEL尚未存在設定,則返回NULL.
//如果是3.2.1版本的話,支援設定預設值.such as
C('my_config','null','default_config');
//如果my_config沒有設定的話,則返回default_config
- 1
- 2
- 3
C方法ue可以用於讀取二維配置:
//獲取使用者配置中的使用者型別設定
C('USER_CONFIG.USER_TYPE');
- 1
- 2
因為配置引數是全域性有效的,因此C方法可以在任何地方讀取任何配置,即使某個設定引數以及生效過期了
A方法
如果需要跨控制機呼叫的話,可以單獨例項化
//例項化Home模組的User控制器
$User = new \Home\Controller\UserController();
//例項化Admin模組的blog控制器
$Blog = new \Admin\Controller\BlogController();
- 1
- 2
- 3
- 4
上面的程式碼是不是很多,這裡提供了一個快捷呼叫方法A
簡化後如下
//假設當前模組是Home模組
$User = A('User');
$Blog = A('Admin/Blog');
- 1
- 2
- 3
預設情況下,A方法例項化的是預設控制器(Controller),如果你要例項化其他的分層控制器的話,可以使用
//假設當前模組是Home
//例項化Event控制器
$User = A('User');// 等效於new \Home\Event\UserEvent();
$Blog = A('Admin/Blog','Event');// 等效於new \Admin\Event\BlogEvent();
- 1
- 2
- 3
- 4
I方法
在web開發過程中,我們經常要獲取系統變數或者使用者提交的資料.這些資料處理不好就會引起安全隱患,所以tp給我們提供了一個變數獲取功能.
我們先看下傳統獲取方式:
$id = $_GET['id']; // 獲取get變數
$name = $_POST['name']; // 獲取post變數
$value = $_SESSION['var']; // 獲取session變數
$name = $_COOKIE['name']; // 獲取cookie變數
$file = $_SERVER['PHP_SELF']; // 獲取server變數
- 1
- 2
- 3
- 4
- 5
傳統獲取方法沒有統一的安全機制,後期調整比較麻煩,更好的方式是在框架中統一使用I函式進行變數獲取和過濾。
I方法是ThinkPHP用於更加方便和安全的獲取系統輸入變數,可以用於任何地方,用法格式如下:
I('變數型別.變數名/修飾符',['預設值'],['過濾方法或正則'],['額外資料來源'])
- 1
變數型別是指請求方式或者輸入型別
變數型別 | 含義 |
---|---|
get | 獲取GET引數 |
post | 獲取POST引數 |
param | 自動判斷請求型別獲取GET、POST或者PUT引數 |
request | 獲取REQUEST 引數 |
put | 獲取PUT 引數 |
session | 獲取 $_SESSION 引數 |
cookie | 獲取 $_COOKIE 引數 |
server | 獲取 $_SERVER 引數 |
globals | 獲取 $GLOBALS引數 |
path | 獲取 PATHINFO模式的URL引數 |
data | 獲取 其他型別的引數,需要配合額外資料來源引數 |
注意:變數型別不區分大小寫,變數名則嚴格區分大小寫。 預設值和過濾方法均屬於可選引數。
下面是I方法的範例使用
echo I('get.id'); // 相當於 $_GET['id']
echo I('get.name'); // 相當於 $_GET['name']
- 1
- 2
支援預設值:
echo I('get.id',0); // 如果不存在$_GET['id'] 則返回0
echo I('get.name',''); // 如果不存在$_GET['name'] 則返回空字串
- 1
- 2
採用方法過濾:
// 採用htmlspecialchars方法對$_GET['name'] 進行過濾,如果不存在則返回空字串
echo I('get.name','','htmlspecialchars');
- 1
- 2
支援直接獲取整個變數值
// 獲取整個$_GET 陣列
I('get.');
- 1
- 2
用同樣的方式,我們可以獲取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']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
param變數型別是框架特有的支援自動判斷當前請求型別的變數獲取方式,例如:
echo I('param.id');
- 1
如果當前請求型別是GET,那麼等效於 GET[′id′],如果當前請求類型是POST或者PUT,那麼相當於獲取_POST[‘id’]
或者 PUT引數id。
由於param型別是I函式預設獲取的變數型別,因此事實上param變數型別的寫法可以簡化為:
I('id');
// 等同於 I('param.id')
I('name');
// 等同於 I('param.name')
- 1
- 2
- 3
- 4
path型別變數可以用於獲取URL引數(必須是PATHINFO模式引數有效,無論是GET還是POST方式都有效),例如: 當前訪問URL地址是 http://serverName/index.php/New/2013/06/01
echo I('path.1');
// 輸出2013
echo I('path.2');
// 輸出06
echo I('path.3');
// 輸出01
- 1
- 2
- 3
- 4
- 5
- 6
data型別變數可以用於獲取不支援的變數型別的讀取,例如:
I('data.file1','','',$_FILES);
- 1
變數過濾
如果你沒有在呼叫I函式的時候指定過濾方法的話,系統會採用預設的過濾機制(由DEFAULT_FILTER配置),事實上,該引數的預設設定是:
// 系統預設的變數過濾機制
'DEFAULT_FILTER' => 'htmlspecialchars'
- 1
- 2
也就說,I方法的所有獲取變數如果沒有設定過濾方法的話都會進行htmlspecialchars過濾,那麼:
// 等同於 htmlspecialchars($_GET['name'])
I('get.name');
- 1
- 2
同樣,該引數也可以設定支援多個過濾,例如:
'DEFAULT_FILTER' => 'strip_tags,htmlspecialchars'
- 1
設定後,我們在使用:
// 等同於 htmlspecialchars(strip_tags($_GET['name']))
I('get.name');
- 1
- 2
如果我們在使用I方法的時候 指定了過濾方法,那麼就會忽略DEFAULT_FILTER的設定,例如:
// 等同於 strip_tags($_GET['name'])
echo I('get.name','','strip_tags');
- 1
- 2
I方法的第三個引數如果傳入函式名,則表示呼叫該函式對變數進行過濾並返回(在變數是陣列的情況下自動使用array_map進行過濾處理),否則會呼叫PHP內建的filter_var方法進行過濾處理,例如:
I('post.email','',FILTER_VALIDATE_EMAIL);
- 1
表示 會對$_POST[‘email’] 進行 格式驗證,如果不符合要求的話,返回空字串。 (關於更多的驗證格式,可以參考 官方手冊的filter_var用法。) 或者可以用下面的字元標識方式:
I('post.email','','email');
- 1
可以支援的過濾名稱必須是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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
還可以支援進行正則匹配過濾,例如:
// 採用正則表示式進行變數過濾
I('get.name','','/^[A-Za-z]+$/');
I('get.id',0,'/^\d+$/');
- 1
- 2
- 3
如果正則匹配不通過的話,則返回預設值。
在有些特殊的情況下,我們不希望進行任何過濾,即使DEFAULT_FILTER已經有所設定,可以使用:
// 下面兩種方式都不採用任何過濾方法
I('get.name','','');
I('get.id','',false);
- 1
- 2
- 3
一旦過濾引數設定為空字串或者false,即表示不再進行任何的過濾。
最新版本的I函式支援對變數使用修飾符功能,可以更方便的通過型別過濾變數。
I('變數型別.變數名/修飾符')
相關推薦
TP框架中的M,D,C,A,I,S方法
邏輯 沒有 命名空間 官方 shmop 通用 匹配 xtend 包括 M方法 M實例化參數是數據庫的表名 //使用M方法實例化$User = M(‘User‘);//和用法$User = new /Think/Model (‘User‘);等效//執行其他的數據操作$Use
tp中的M,D,C,A,I,S方法
M方法 //使用M方法例項化 $User = M('User'); //和用法$User = new \Think\Model ('User');等效 //執行其他的資料操作 $User->select();12345 M 方法也支援垮庫操作. //使用M方法例項
git 簡寫標誌 M D R A T
git 簡寫標誌 M D R A T等含義 在使用git checkout , git status,或git diff files時會出現奇怪的標誌。如M,T,D,A,R,U等等。 如:# git checkout master M cpp-iniparser 檔
輸入資料需換行時不可用scanf("%c",a[i]),用scanf("%c",a+i)
從鍵盤拍入的內容,在 “鍵盤緩衝區”,當拍了 Enter 鍵(平時喊它回車鍵)時,鍵盤 緩衝區 的內容 才被 送到 “輸入緩衝區”。 scanf() 讀數時 是到 “輸入緩衝區” 取數,“輸入緩衝區” 沒內容 時,scanf() 等待。 scanf("%c",a+i) 這種格
介紹了webkit到webengine的和webengine中js和C++互相呼叫的方法
pro檔案 檔案中需要加入”QT += core gui webenginewidgets”這句話,不然提示找不到檔案 QT += core gui QT += core gui webenginewidgets greaterThan(QT_MAJOR
Hibernate discriminator-value用法
... </id> <discriminator column="flag" type="string" /> <!-- 公共屬性的對映 --> <subclass name="CustomerA" discriminator-value="A"
輸出的字串中有空格並且無法替換B e a r e r N D c y Z T g 4 N z A t N 2 N h Z C 0 0 Y 2 E 4 L T g x M W E t O D Y
###1.檔案如下: Request url: appv2.qichacha.net/app/v1/extras/getVersion?platform=android&version=11.3.0×tamp=1543816102814&sign=ddc
SVN更新專案A C D M G U R I的含義
A:add,新增 C:conflict,衝突 D:delete,刪除 M:modify,本地已經修改 G:modify and merGed,本地檔案修改並且和伺服器的進行合併 U:update,從伺
【轉】PHP date("Y-m-d H:i:s");獲取當前時間 差8小時解決辦法
class etc AS 北京 shang 時間 字母 重啟 asi 原因: 網絡資源
readline中的鍵盤碼^[[A,^[[B,^[[D,^[[C (ANSI控制碼)
最近除錯u-boot的readline,對一些特殊按鍵鍵值有些疑惑,比如↑↓←→四個鍵,在linux的minicom敲下這幾個鍵,串列埠會輸出什麼資料。其實不需要用串列埠測試,我們可以寫個小程式測試一下: 點選(此處)摺疊或開啟 #include <stdi
HTTP請求行中包含哪些內容?A、請求方法 B、資源名稱 C、版本號 D、狀態程式碼
答案:ABC解析:Http請求是指從客戶端到伺服器端的請求訊息。該請求訊息包括,在訊息首行中,對資源的請求方法、資源的識別符號及使用的協議。HTTP請求資訊由3部分組成:l 請求方法URI協議/版本l 請求頭(Request Header)l 請求正文HTTP響應HTTP應
Android Intent對應的category類別大全
android.intent.category.ALTERNATIVE android.intent.category.BROWSABLE android.intent.category.DEFAULT android.intent.category.DEVEL
在由N個正整數的集合S中,找出最大元素C,滿足C=A + B
其中A,B都是集合S中元素,請給出演算法描述,程式碼與時間複雜度分析. int findNum(vector<int> &S) { sort(S.begin(), S.end()); int n = S.size(); for (
Codeforces Round #422 (Div. 2) A. I'm bored with life 暴力
out line leave c++ ren round ... from cif A. I‘m bored with life Holidays have finished. Thanks to the help of t
Round #422 A. I'm bored with life
exactly learn ica largest color esp res error divide Holidays have finished. Thanks to the help of the hacker Leha, Noora managed to ent
C++中關於class B:A與Class B::A問題
include tsa int() pri 示例 pre 派生類 std boost 一,class B:A為類的繼承關系,即A類是B類的基類class <派生類名>:<繼承方式><基類名>{<派生類新定義成員>}; 例如:
lintcode 734. 形式為a^i b^j c^k的子序列數量 題解
排列組合 lint 題解 else 時間復雜度 不同 con count cab 描述 給一字符串, 對形式為 a^i b^j c^k 的子序列進行計數, 即它由 i 個字符 a, 接著是 j 個字符 b, 然後是 k 個字符 c組成, i >= 1, j >
A - I'm bored with life
from lis oos greate pre ask In student greatest Holidays have finished. Thanks to the help of the hacker Leha, Noora managed to enter the
C語言,有N個硬幣面值為a[1]...a[N],給一個非負數m,用這些硬幣湊成m,求有多少種方法?
#include <stdio.h> #include <memory.h> #define N 1000 #define M 100000 int a[N]; int DP[M]; int dpItUnlimited(int m, i
給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法
題目描述 給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 /* 思路:題目要求B的i個元素等於A中除了i個元素所以元素乘積 因此思路很清