CodeIgniterソース読解(四)(Loader.php)


Loader.phpの関数は基本的にCI全体でコードを書くときに最も長く使われています.Cotrollersで最も長く使用されている$this->load->view()メソッドを記述し、__constructでよく使われている$this->load->helper(url)は、ここで定義されています.さらに、私たちがmodelをloadした後、$this->some_modelを直接使用して呼び出すことができ、Loaderクラスと大きな関係があります.
もちろんこの部分も一番説明しにくいと思いますが、大雑把に説明しましょう.
  • このクラスは最初から十数個の変数を定義し、最初はintタイプで、その他はすべて配列である.
    最初のパラメータは出力状態をマークするために使用され、これがOutputクラスに着いたときに見に行きます(私もこのパラメータの使用場所を具体的に探していませんが、現在は字面の意味から推測しています).
    残りのいくつかのパラメータもよく理解されており、4つのpaths文字があり、対応するファイルのパスを記録するために使用されます.残りもクラスや変数などの情報を格納するために使用されます.具体的な用途は関数に分析してもいいです.
  • 構造関数とinitialize関数
    コンストラクション関数では、上記で定義した変数を初期化します.このうち_ci_ob_levelob_get_level関数を直接呼び出し、commonクラスのis_loadedが返した結果は_base_classes(CIのコアモジュールがロードされる前にロードされるベースクラス)に与えられる.次にis_loadedの方法を書き直した.クラスの重複ロードを回避します.
  • クラスライブラリとmodelに組み込まれた関数
    この2つの関数はよく使われています.libraryという関数のパラメータはlibrary名の配列であってもよい.最後に_ci_load_class関数を呼び出してクラスをロードする.
    同様にmodel部分は配列の形で複数をロードすることもできる.関数はまずディレクトリ情報が含まれているかどうかを判断し、分解する.モデルに名前が定義されているかどうか、モデルがロードされているかどうか、モデルの名前が競合しているかどうかを確認します.$model = strtolower($model);=>modelファイル名はすべて小文字で、ファイルが存在するかどうかを確認します.3番目のパラメータがfalseでない場合、データベースに接続する必要があることを示し、次のdatabase関数が呼び出されます.親モデルをロードし、モデルをロードします.
  • データベースとデータベースをロードする補助関数
    model,database,dbuil,dbforgeの3つの関数.database=>>は手動でデータベースに接続するために使用されますが、configで自動接続データベースを設定することができます.主にdatabaseフォルダの下のDB関数を呼び出すことができます.dbutil=>データベースツールクラス(utilityクラス)をロードするための関数です.このクラスには、データベースをエクスポートするcsv_from_result関数などの一般的な補助関数があります.dbforge==>データベースメンテナンスクラス(forge)をロードするための関数です.このクラスには、データベースの追加や削除などの関数があります.
    データベースの部分については、後で見たときに具体的に分析します.
  • ビューとファイルをマウントする関数
    いずれも_ci_load関数を呼び出して、後でこの関数を見に行きます.
  • 変数の設定と取得変数(varsget_var)vars関数は文字列または配列またはobjectをarrayに変換し、配列から_ci_cached_varsに存在し、get_var_ci_cached_varsからデータを取り出す.この2つの関数の効果はviewがデータを伝達する方法と同じで、使用するのは比較的少ないようです.
  • helper、helpers、language、config、driver
    このいくつかの関数は一緒に言って、このいくつかの関数の形式と使い方はすべて類似しています;helperhelpers関数は、helpersがhelerの効果を直接呼び出すため、完全に同じ効果です.load部分の多くの関数が受け入れるパラメータは配列や文字列形式であり、関数は判断して処理されることがわかります.特筆すべきはhelper関数が_ci_prep_filenameを呼び出してファイル名を解析することであり、この関数を見てみると、関数名はstr_replaceで処理されていることがわかるので、helperファイルを作成するとき、_helperの接尾辞は必要ではありません.language関数の構造は簡単で、言語ファイル名の配列(文字列が先に配列に組み立てられている場合)をlangクラスにループ渡すload関数処理である.lang類については、過去を見てから見ましょう.configはより簡単で、configクラスのload関数を直接呼び出します.configのデフォルトパラメータは文字列であることに注意してください.driver関数の具体的な用途ははっきりしていませんが、この関数を見てみると、CI_Driver_Libraryクラスがロードされているかどうかを確認し、なければファイルをロードし、library関数を呼び出して処理します.
  • (add/get/remove)_package_paths
    パッケージパスの追加/取得/削除;構造は言うまでもなく、CIはファイルと関数の命名と細部の処理において開発者の参考に値すると思います.add_package_pathsremove_package_pathsの構造は基本的に似ており、1つはlibiary、helper、views、configフォルダパスを追加することであり、1つは削除パスであり、array_shiftarray_unshiftの2つの関数が使用される限り、remove_package_pathsにはフレームワークのデフォルトパスが誤って削除されないことを保証するためにarray_uniqueが使用されている.get_package_pathsはpackageのパスを返し、デフォルトではフレームワークのベースパスは含まれません.
  • _ci_load_ci_load_class_ci_init_class _ci_loadはviewおよびfile関数呼び出しのために使用され、ファイルまたはビューをロードするために使用される.これは重要な関数です.ビューのロード、バッファ、転送変数などはこの関数に関係しています.関数の具体的な実現形式は少し複雑で、後で詳しく理解します.個人的にはこれは非常に重要な関数だと思います.詳しくは下を参照してください._ci_load_classはクラスをマウントするために使用され、library関数によって呼び出される._ci_init_classを呼び出してクラスをインスタンス化する.この3つの関数は細かく読む必要があり、よく理解する必要があります.
  • _ci_autoloader
    congfig/autoloadで設定された自動ロードが必要なクラスをマウントし、initializeで呼び出す.
  • の3つの補助関数
    このうち_ci_prep_filenameは、上述したように、ファイル名を解析するために使用される.

  • PS:_ci_load関数の読み取りと注釈
    
        protected function _ci_load($_ci_data)
    {
        //                 ;        ,    ;
        foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)
        {
            //                   ,           ,
            //     ,   false;
            $$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];
        }
        //`$file_exists`             ;
        $file_exists = FALSE;
    
        // file    `_ci_load`         ,  `_ci_path`   ,
                //  explode    ,                 ;
        if ($_ci_path != '')
        {
            $_ci_x = explode('/', $_ci_path);
            $_ci_file = end($_ci_x);
        }
        else
        {
            //  `_ci_path`  ,   `_ci_view`     (         ,
            //     load file,         view      )
            $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
            //       ,              ,      ~~
            $_ci_file = ($_ci_ext == '') ? $_ci_view.'.php' : $_ci_view;
    
            foreach ($this->_ci_view_paths as $view_file => $cascade)
            {
                // `view_path`   view  ,             `_ci_path`
                //       ;
                if (file_exists($view_file.$_ci_file))
                {
                    $_ci_path = $view_file.$_ci_file;
                    $file_exists = TRUE;
                    break;
                }
                //         $cascade  bool  ,             
                //              ;          ?        ,
                //       ?
                if ( ! $cascade)
                {
                    break;
                }
            }
        }
        //        view   ;
        if ( ! $file_exists && ! file_exists($_ci_path))
        {
            show_error('Unable to load the requested file: '.$_ci_file);
        }
    
        //      CI         Loader   ,       
                //      `$this->abc`              。
        $_ci_CI =& get_instance();
        foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)
        {
            if ( ! isset($this->$_ci_key))
            {
                $this->$_ci_key =& $_ci_CI->$_ci_key;
            }
        }
    
        //  extract         ;
        if (is_array($_ci_vars))
        {
            $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
        }
        extract($this->_ci_cached_vars);
    
        //      ;
        ob_start();
    
        //  php.ini  `short_open_tag`      ;             
        //  ~~~      ;
        if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
        {
            echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));
        }
        else
        {
            //      ,    include;
            include($_ci_path);
        }
        //    
        log_message('debug', 'File loaded: '.$_ci_path);
    
        //         ,    `ob_get_contents`  ,    
                //`ob_end_clean`                     ;
        if ($_ci_return === TRUE)
        {
            $buffer = ob_get_contents();
            @ob_end_clean();
            return $buffer;
        }
    
        //                     ,      , flush 
            //            ,   Output    ;
        if (ob_get_level() > $this->_ci_ob_level + 1)
        {
            ob_end_flush();
        }
        else
        {
            //     Output          ;
            $_ci_CI->output->append_output(ob_get_contents());
            @ob_end_clean();
        }
    }
    
        //      CI             ,       PHP    !
    

    この類はとても重要で、簡単ではありません;長い間読んでいましたが、どの言葉もはっきり言えませんでしたが、よく読みます.