ThinkPHPソース分析シリーズ-ADSL方法


プログラミング効率を向上させ、統一管理を容易にするために、ThinkPHPは一連のショートカット方法を作成し、これらのショートカット方法はすべて単一の大文字で命名され、これらのアルファベットは往々にして関数の用途を代表する英語の単語の頭文字である.これらの方法には、A-Actionクラス関数の高速インスタンス化、C-アクセス構成パラメータ値関数の高速インスタンス化、D-Modelクラス関数の高速インスタンス化、M-Modelクラス関数の高効率インスタンス化、L-アクセス言語パラメータ値関数のアクセス、S-アクセスキャッシュ関数のアクセス、U-URL動的生成およびリダイレクト関数などがあります.ショートカットメソッドにはADSLが含まれているため、ショートカットメソッドをADSLメソッドとも呼ぶ.
 
説明しなければならないのは、ADSLメソッドではGメソッド(記録と統計時間関数)を除き、残りのメソッドはシステム関数ライブラリで定義され、Gメソッドはフレームワークファイルで定義されるので、一般的には~runtime.phpファイルにコンパイル・キャッシュされ、つまりすべてのADSLメソッドがグローバルに表示され、どこでもADSLメソッドを呼び出すことができる.
 
ADSL法では4つの比較が基本であり,ThinkPHPフレームワークに基づく開発応用でよく用いられるのはC,D,M,Uの4つの方法であるが,U法の実現と用法は複雑であり,別の文章「ThinkPHPソース分析シリーズ−ADSL法のU法」で単独で紹介するが,ここではC法,D法,M法の3つの方法についてのみ紹介する.
 
一、C方法
//      
function C($name=null, $value=null) {
    static $_config = array();
    //         
    if (empty($name))
        return $_config;
    //            
    if (is_string($name)) {
        if (!strpos($name, '.')) {
            $name = strtolower($name);
            if (is_null($value))
                return isset($_config[$name]) ? $_config[$name] : null;
            $_config[$name] = $value;
            return;
        }
        //            
        $name = explode('.', $name);
        $name[0] = strtolower($name[0]);
        if (is_null($value))
            return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;
        $_config[$name[0]][$name[1]] = $value;
        return;
    }
    //     
    if (is_array($name))
        return $_config = array_merge($_config, array_change_key_case($name));
    return null; //       
}

Cメソッドは2つのパラメータを受け入れ、デフォルトは空であることがわかります.両方のパラメータが空の場合、このメソッドで構成されたすべての値が返され、関数は静的配列によってこれらの値を格納します.最初のパラメータが空でなく文字列である場合、パラメータの命名規則が解析されます.パラメータ名に「.」が含まれていない場合は、パラメータは小文字変換処理され、2番目のパラメータが空でない場合、2つのパラメータはキー値ペアとして静的配列に格納されます.そうしないと、構成されたパラメータの値または空が返されます.パラメータ名に「.」が含まれている場合は、パラメータを「.」配列に分割する、2番目のパラメータが空でない場合、2つのパラメータは、静的配列(2 D配列)にキー値のペアとして格納されます.そうでない場合は、構成されたパラメータの値または空が返されます.最初のパラメータが空でなく、配列である場合は、その配列キー名を小文字に変換して静的配列に追加し、最後に静的数のグループに戻ります.残りの場合は、不正なパラメータを回避するために空の値が返されます.
 
Cメソッドの実装を知ってから、Cメソッドを使用すると簡単になります.Cメソッドにパラメータを渡すことで、このパラメータがプロファイルで設定されている場合、そのパラメータの値を取得できます.Cメソッドは、2次元配列の構成値を取得することをサポートします.プロファイルに配列フォーマットを定義し、Cメソッドに渡すだけです.接続するパラメータでいいです.Cメソッドに2番目のパラメータを渡すと、Cメソッドはパラメータを動的に構成し、1番目のパラメータは構成項目名、2番目のパラメータは構成項目値です.Cメソッドは,点構文(.)により2次元配列の値を構成することをサポートする.
 
二、D方法
/**
  +----------------------------------------------------------
 * D       Model
  +----------------------------------------------------------
 * @param string name Model  
 * @param string app Model    
  +----------------------------------------------------------
 * @return Model
  +----------------------------------------------------------
 */
function D($name='', $app='') {
    static $_model = array();
    if (empty($name))
        return new Model;
    if (empty($app))
        $app = C('DEFAULT_APP');
    if (isset($_model[$app . $name]))
        return $_model[$app . $name];
    $OriClassName = $name;
    if (strpos($name, '.')) {
        $array = explode('.', $name);
        $name = array_pop($array);
        $className = $name . '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メソッドは、カスタムビジネスロジックのModelクラスをインスタンス化するために使用されます.Dメソッドには、モデルクラス名とモデルクラスが存在するアイテムの2つのパラメータがあります.デフォルトは空です.モデルクラスが見つからない場合は、ベースモデルクラスModelクラスがインスタンス化され、インスタンス化オブジェクトが返されます.プロジェクトが設定されていない場合、システムのデフォルトモデルクラスは現在のプロジェクトの下にあります.プログラミング効率とコード再利用性を向上させるために、Dメソッドでポイント構文を使用可能(.)は、プロジェクト間インスタンスモデルクラスを実現するためのものであり、デフォルトは、現在のプロジェクトの下のモデルクラスである.ThinkPHPは、モデルクラス名の命名規則をチェックすることにより、それぞれ異なるモデルクラスをロードする.次に、これらのモデルクラスが存在するか否かを判断し、存在する場合はそのモデルクラスをインスタンス化し、存在しない場合は基礎モデルクラスModelをインスタンス化する.なお、Dメソッドでは一静を定義するステータス配列は、インスタンス化されたモデルクラスを格納します.モデルクラスがインスタンス化されている場合、システムはインスタンス化を繰り返すことはありません.これにより、メモリの使用が減少し、アプリケーションのパフォーマンスが向上します.
 
三、M方法
/**
  +----------------------------------------------------------
 * M                Model
  +----------------------------------------------------------
 * @param string name Model  
  +----------------------------------------------------------
 * @return Model
  +----------------------------------------------------------
 */
function M($name='', $class='Model') {
    static $_model = array();
    if (!isset($_model[$name . '_' . $class]))
        $_model[$name . '_' . $class] = new $class($name);
    return $_model[$name . '_' . $class];
}

MメソッドはDメソッドの特例と見なすことができる.モデルファイルのないModelをインスタンス化します.すなわち、独自のビジネスロジックを定義せず、システムパッケージのCURDの簡単な操作しか実現できません.アプリケーションが単純にデータベースを操作する場合、Mメソッドを使用してオブジェクトをインスタンス化することは効率的な選択です.同様に,Mメソッドもモデルクラスをインスタンス化しない.
 
(完)