1. 程式人生 > >tp中的M,D,C,A,I,S方法

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]POSTPUT_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('變數型別.變數名/修飾符')