ThinkPHPフレームワーク研究の一つの基本関数MとDの違い
3658 ワード
MメソッドとDメソッドの違い
ThinkPHPでは、MメソッドとDメソッドがモデルクラスをインスタンス化するために使用され、Mメソッドはベースモデルクラスを効率的にインスタンス化するために使用され、Dメソッドはユーザー定義モデルクラスをインスタンス化するために使用されます.
Mメソッドの使用
次の場合は、Mメソッドの使用を検討してください.
Mメソッドは、パラメータテーブル名に対応するデータテーブルの操作を簡単に見ることができます.
Dメソッドの使用
次の場合は、Dメソッドの使用を検討してください.
また、Dメソッドはプロジェクト間呼び出しをサポートしていません.使用する必要があります.
ヒント
プロジェクトグループが有効になっている場合、Modelクラスは必ずしもプロジェクトグループに対応しているわけではありません.複数のプロジェクトグループ間で共有されるモデルクラスは、Modelディレクトリの下に統一され、D('ModelName')を直接使用してインスタンス化できます.一方、D('User.UserInfo')は、Userが必ず1つのプロジェクトグループであることを示すものではなく、Modelの下のファイルに対する分類ディレクトリのみであってもよく、D('User.UserInfo')は、Userディレクトリの下のUserInfoモデルクラスをインスタンス化している.
まとめ
以上はM法とD法の違いのいくつかのまとめであり,M法とD法は実際の状況に応じて具体的に選択しなければならない.
2つの共通点があります.すべてインスタンス化オブジェクト用..
しかし、使用時には両者が異なります...どうして?
まずコードを見てみましょう
関数M
$_model[$name . '_' . $class] = new $class($name);
デフォルトはnew Model($name)です
つまりMはModelのオブジェクトを返します
$nameが空でない場合、$nameの意味はデータベースを表すテーブル名です(これは後述します)
この対応するModelファイルが存在しなくても、直接Modelメソッド(ThinkPHPベースクラス)をインスタンス化することによって、Modelオブジェクトを動的にインスタンス化します.
Dメソッドを見てみましょう
具体的な注釈はすでにコードの中にあります
両者を比べると...
D関数は、現在のプロジェクトのLib/Modelの下にあるモジュールをインスタンス化します.
モジュールが存在しない場合は、インスタンス化Modelのオブジェクトに直接戻ります(意味はM()関数と同じです).
MはModelをインスタンス化するオブジェクトのみを返します..その$nameパラメータはデータベースのテーブル名としてデータベースに対する操作を処理します.
一般的に言えば、DはModelファイルベースのModelをインスタンス化し、Mは対応するModelファイルが存在しなくても、直接インスタンス化Modelメソッド(ThinkPHPベースクラス)によって動的にModelオブジェクトをインスタンス化する.さらに一般的に言えば、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インスタンス化されているのは、モデルフォルダの下に自分で作成したモデルファイルです.