ホームページ  >  記事  >  バックエンド開発  >  ThinkPHP の M 関数と D 関数の違い

ThinkPHP の M 関数と D 関数の違い

WBOY
WBOYオリジナル
2016-06-13 13:06:18900ブラウズ

ThinkPHP の M 関数と D 関数の違い
参照元: http://blog.csdn.net/siren0203/archive/2010/10/29/5974415.aspx

この 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);

もデフォルトですこれは新しい Model($name)

です。つまり、M は Model オブジェクト

を返します。$name が空でない場合は、 $name 意味は、データベースのテーブル名を表すことです (これについては後で説明します)

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;
}

具体的なコメントはすでにコードに含まれています

この 2 つを比較するとわかるはずです...

D 関数は、現在のプロジェクトの Lib/Model の下でモジュールをインスタンス化します
If モジュールが存在しない場合は、インスタンス化された Model のオブジェクトを直接返します (意味は M() 関数と同じです)

と M はインスタンス化された Model のオブジェクトのみを返しますModel。その $name パラメータはデータベースのテーブル名として使用されます。データベース上の処理操作

平たく言えば、D は Model ファイルに基づいて Model をインスタンス化し、M は直接 Model オブジェクトを動的にインスタンス化します。対応する Model ファイルが存在しない場合でも、Model メソッド (ThinkPHP 基本クラス) をインスタンス化します。

より簡単に言うと、

M インスタンス化パラメータはデータベースのテーブル名です。
D インスタンス化は、モデル フォルダー モデル ファイルの下に自分で作成されます。 .

1階 ナインドア 2011-10-23

親愛なる友人、もう一つ質問があります。奇妙な気がしますが、理由はわかりません。
thinkphp フレームワークを使用してデータベース内のデータ エンコーディングを取得し、xml を返したとき、
d メソッドを使用してデータベースを取得すると、出力の前に余分なスペースがいくつかあることがわかりました。 xmlですが、理由はわかりません。
代わりに m メソッドを使用すると、スペースが消えます。
アドバイスを求めています。
ninedoors@126.com

2階 もう一度あの風景と出会う 2011-10-31

ninedoors は
と書きました。親愛なる友人、私には別の問題があります。奇妙な気がしますが、理由はわかりません。
thinkphp フレームワークを使用してデータベース内のデータ エンコーディングを取得し、xml を返したとき、
d メソッドを使用してデータベースを取得すると、出力の前に余分なスペースがいくつかあることがわかりました。 xmlですが、理由はわかりません。
代わりに m メソッドを使用すると、スペースが消えます。
アドバイスを求めています。
ninedoors@126.com
私はこのような状況に遭遇したことはありませんが、トリムや正規表現などの関数を使用してこれらのスペースをフィルターで除外できます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。