在thinkphp中,D方法可以返回實(shí)例化的模型對象。D方法用于實(shí)例化自定義模型類,是ThinkPHP框架對Model類實(shí)例化的一種封裝,語法“D(‘[項(xiàng)目://][分組/]模型’,’模型層名稱’)”,返回值為實(shí)例化的模型對象。
本教程操作環(huán)境:Windows7系統(tǒng)、thinkphp v5.1版、Dell G3電腦。
D方法應(yīng)該是用的比較多的方法了,用于實(shí)例化自定義模型類,是ThinkPHP框架對Model類實(shí)例化的一種封裝,并實(shí)現(xiàn)了單例模式,支持跨項(xiàng)目和分組調(diào)用,調(diào)用格式如下:
D('[項(xiàng)目://][分組/]模型','模型層名稱')
D方法的返回值是實(shí)例化的模型對象。
D方法可以自動檢測模型類,如果存在自定義的模型類,則實(shí)例化自定義模型類,如果不存在,則會實(shí)例化Model基類,同時對于已實(shí)例化過的模型,不會重復(fù)去實(shí)例化。
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
D方法最常用的用法就是實(shí)例化當(dāng)前項(xiàng)目的某個自定義模型,例如:
//?實(shí)例化User模型 $User?=?D('User');
會導(dǎo)入當(dāng)前項(xiàng)目下面的Lib/Model/UserModel.class.php文件,然后實(shí)例化UserModel類,所以,實(shí)際上的代碼可能和下面的等效:
import('@.Model.UserModel'); $User?=?new?UserModel();
D方法可以支持跨分組和項(xiàng)目實(shí)例化模型,例如:
//實(shí)例化Admin項(xiàng)目的User模型 D('Admin://User') //實(shí)例化Admin分組的User模型 D('Admin/User')
3.1版本開始,由于增加了分層模型的支持,所以D方法也可以實(shí)例化其他的模型,例如:
//?實(shí)例化UserService類 $User?=?D('User','Service'); //?實(shí)例化UserLogic類 $User?=?D('User','Logic');
D('User','Service');
會導(dǎo)入Lib/Service/UserService.class.php,并實(shí)例化。
擴(kuò)展知識:D和M的區(qū)別主要在于
M方法不需要創(chuàng)建模型類文件,M方法不會讀取模型類,所以默認(rèn)情況下自動驗(yàn)證是無效的,但是可以通過動態(tài)賦值的方式實(shí)現(xiàn)
而D方法必須有創(chuàng)建模型類。
我們可以用下面兩種方法去創(chuàng)建一個數(shù)據(jù)表的映射對象
第一種:$Test = D(‘Test’)
第二種:$Test = new Model(‘Test’)
雖然這兩種都可以對數(shù)據(jù)進(jìn)行select,insert,delete,udpate操作,在
數(shù)據(jù)驗(yàn)證上有很大的不同,
用第一種方式實(shí)例一個模型就會有數(shù)據(jù)檢查功能,如果 title 沒有填寫的話就會提示 “請輸入標(biāo)題” (這個是tp提供的一個自動驗(yàn)證功能,當(dāng)然也需要在相應(yīng)的model中定義好驗(yàn)證條件);
如果用第二種就沒有了這個數(shù)據(jù)驗(yàn)證功能,需要手動驗(yàn)證。
總結(jié)如下:
-
D函數(shù)實(shí)例化的是你當(dāng)前項(xiàng)目的Lib/Model下面的模塊。
-
如果該模塊不存在的話,直接返回實(shí)例化Model的對象(意義就與M()函數(shù)相同)。
-
而M只返回,實(shí)例化Model的對象。它的$name參數(shù)作為數(shù)據(jù)庫的表名來處理對數(shù)據(jù)庫的操作。
通俗點(diǎn)說:
-
D就是實(shí)例化一個基于Model文件的Model。
-
M則是通過直接實(shí)例化Model方法(ThinkPHP基類)來動態(tài)的實(shí)例化一個Model對象,即使這個對應(yīng)的Model文件不存在。
再通俗一點(diǎn)說:
-
M實(shí)例化參數(shù)是數(shù)據(jù)庫的表名。
-
D實(shí)例化的是你自己在Model文件夾下面建立的模型文件。
-
D就是在你沒有定義模型的時候,系統(tǒng)自動幫你定義一個模型,這樣你才進(jìn)行簡單的數(shù)據(jù)輸入或者輸出。
-
每一個Action文件都應(yīng)該對應(yīng)Model文件的,如果你定義了Model的話,
如:$Form = D(“User”)就可以改成$Form = new? UserModel();(User是指你的模型文件名)。
【相關(guān)教程推薦:thinkphp框架】