ThinkPHPフレームワーク研究の一つの基本関数MとDの違い

3658 ワード

MメソッドとDメソッドの違い
ThinkPHPでは、MメソッドとDメソッドがモデルクラスをインスタンス化するために使用され、Mメソッドはベースモデルクラスを効率的にインスタンス化するために使用され、Dメソッドはユーザー定義モデルクラスをインスタンス化するために使用されます.
Mメソッドの使用
次の場合は、Mメソッドの使用を検討してください.
          CURD             
                 ,  M        CommonModel        

Mメソッドは、パラメータテーブル名に対応するデータテーブルの操作を簡単に見ることができます.
$User = M('User');

Dメソッドの使用
次の場合は、Dメソッドの使用を検討してください.
     ThinkPHP                 (create()     )、     
        ,       
                  (Lib/Model   ),              

また、Dメソッドはプロジェクト間呼び出しをサポートしていません.使用する必要があります.
$User = D('User', 'Admin');    //     Admin       User   
$User = D('Admin.User');        //        

ヒント
プロジェクトグループが有効になっている場合、Modelクラスは必ずしもプロジェクトグループに対応しているわけではありません.複数のプロジェクトグループ間で共有されるモデルクラスは、Modelディレクトリの下に統一され、D('ModelName')を直接使用してインスタンス化できます.一方、D('User.UserInfo')は、Userが必ず1つのプロジェクトグループであることを示すものではなく、Modelの下のファイルに対する分類ディレクトリのみであってもよく、D('User.UserInfo')は、Userディレクトリの下のUserInfoモデルクラスをインスタンス化している.
まとめ
M     D                        ,    M      ;             ,      D  。

           :M                 ,          ;  D                    Office、QQ      ,      ,              。

以上はM法とD法の違いのいくつかのまとめであり,M法とD法は実際の状況に応じて具体的に選択しなければならない.
2つの共通点があります.すべてインスタンス化オブジェクト用..
しかし、使用時には両者が異なります...どうして?
まずコードを見てみましょう
関数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ファイルが存在しなくても、直接Modelメソッド(ThinkPHPベースクラス)をインスタンス化することによって、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ファイルが存在しなくても、直接インスタンス化Modelメソッド(ThinkPHPベースクラス)によって動的にModelオブジェクトをインスタンス化する.さらに一般的に言えば、Mインスタンス化パラメータはデータベースのテーブル名である.Dインスタンス化されているのは、モデルフォルダの下に自分で作成したモデルファイルです.