ThinkPHP框架研究之一 基本函數 M和D的區別

M方法和D方法的區別

ThinkPHP 中M方法和D方法都用於實例化一個模型類,M方法 用於高效實例化一個基礎模型類,而 D方法 用於實例化一個用戶定義模型類。php

使用M方法

若是是以下狀況,請考慮使用 M方法:java

對數據表進行簡單的 CURD 操做而無複雜的業務邏輯時
只有個別的表有較爲複雜的業務邏輯時,將 M方法 與實例化 CommonModel 類進行結合使用

M方法 甚至能夠簡單看着就是對參數表名對應的數據表的操做:數據庫

$User = M('User');

使用D方法

若是是以下狀況,請考慮使用 D方法:c#

須要使用 ThinkPHP 模型中一些高級功能如自動驗證功能(create()方法中實現)、關聯模型等
業務邏輯比較複雜,且涉及的表衆多
將業務邏輯定義在了自定義的模型類裏面(Lib/Model目錄下),而想在操做中實現這些業務邏輯

另外 D方法 不支持跨項目調用,須要使用:app

$User = D('User', 'Admin');    // 實例化 Admin 項目下面的 User 模型
$User = D('Admin.User');        // 啓用了項目分組

提示

啓用了項目分組後,Model 類並沒必要然對應着項目分組。多個項目組之間共有的模型類,統一放在 Model 目錄下,能夠直接使用D('ModelName') 實例化。而 D('User.UserInfo') 並不表示 User 必定是一個項目分組,也能夠僅僅是對 Model 下文件的一個分類目錄,D('User.UserInfo') 實例化的是 User 目錄下的 UserInfo 模型類。函數

總結

M方法 和 D方法 均可以在模型類文件不存在的狀況下直接使用的,但顯然 M方法 更高效;但要使用模型類裏面業務邏輯,就必須使用 D方法。

一個比較形象的比喻就是:M方法 就如一臺剛裝好操做系統的電腦,只能使用一些基本功能;而 D方法 就如在裝好的系統上再安裝了一些如 Office、QQ 等應用軟件,功能更增強大,同時整個電腦運行速度也變慢了。

以上是對 M方法和D方法區別的一些總結,M方法 和 D方法 要根據實際狀況來具體選擇。spa

兩個有共同點..都是實例化對象用的..操作系統

可是 在使用時 二者卻不同...爲何??code

先看看代碼對象

函數M

function M($name = '', $class = 'Model')
{
    static $_model = array();
    if (!isset($_model[$name . '_' . $class]))
        //  默認也就是 new Model($name)
        $_model[$name . '_' . $class] = new $class($name);
        //返回實例化對象
    return $_model[$name . '_' . $class];
}



$_model[$name . '_' . $class] = new $class($name);

默認也就是 new Model($name)

也就是說 M返回的是Model的對象

若是$name不爲空 那麼$name的意義也就是表明數據庫的表名(這個之後說)

經過直接實例化Model方法(ThinkPHP基類)來動態的實例化一個Model對象,即便這個對應的Model文件不存在

再來看 D方法

function D($name = '', $app = '')
{
    static $_model = array();
    if (empty($name))
    //$name爲空 做用就等同 函數M();
        return new Model;
    if (empty($app))
    //默認模塊名稱 在Common/convention.php中定義 =@
        $app = C('DEFAULT_APP');
    //若是已經存在對象 直接返回
    if (isset($_model[$app . $name]))
        return $_model[$app . $name];
    $OriClassName = $name;
    //若是$name參數是以 @.**.模塊名   這種參數傳遞的話
    if (strpos($name, '.'))
    {
        $array = explode('.', $name);
        //$name=模塊名
        $name = array_pop($array);
        $className = $name . 'Model';
        //導入Model模塊所在的文件
        import($app . '.Model.' . implode('.', $array) . '.' . $className);
    }
    //直接導入
     else
    {
        $className = $name . 'Model';
        import($app . '.Model.' . $className);
    }
    //實例化對象返回
    if (class_exists($className))
    {
        $model = new $className();
    } else
    {
        $model = new Model($name);
    }
    $_model[$app . $OriClassName] = $model;
    return $model;
}

具體註釋已經在代碼裏面了

二者對比 你們應該能看出來...

D函數實例化的是 你當前項目的Lib/Model下面的模塊

若是該模塊不存在的話 直接返回實例化Model的對象(意義就與M()函數相同)

而M 只返回 實例化 Model的對象..它的$name參數 做爲數據庫的表名來處理對數據庫的操做

通俗點說,D就是實例化一個基於Model文件的Model,而M則是經過直接實例化Model方法(ThinkPHP基類)來動態的實例化一個Model對象,即便這個對應的Model文件不存在。 

再通俗一點說就是: 
M實例化參數是數據庫的表名. 
D實例化的是你本身在model文件夾下面創建的模型文件.

相關文章
相關標籤/搜索