CodeIgniterソース読解(四)(Loader.php)
7611 ワード
Loader.phpの関数は基本的にCI全体でコードを書くときに最も長く使われています.Cotrollersで最も長く使用されている
もちろんこの部分も一番説明しにくいと思いますが、大雑把に説明しましょう.このクラスは最初から十数個の変数を定義し、最初はintタイプで、その他はすべて配列である.
最初のパラメータは出力状態をマークするために使用され、これがOutputクラスに着いたときに見に行きます(私もこのパラメータの使用場所を具体的に探していませんが、現在は字面の意味から推測しています).
残りのいくつかのパラメータもよく理解されており、4つのpaths文字があり、対応するファイルのパスを記録するために使用されます.残りもクラスや変数などの情報を格納するために使用されます.具体的な用途は関数に分析してもいいです.
構造関数とinitialize関数
コンストラクション関数では、上記で定義した変数を初期化します.このうち
クラスライブラリとmodelに組み込まれた関数
この2つの関数はよく使われています.libraryという関数のパラメータはlibrary名の配列であってもよい.最後に
同様にmodel部分は配列の形で複数をロードすることもできる.関数はまずディレクトリ情報が含まれているかどうかを判断し、分解する.モデルに名前が定義されているかどうか、モデルがロードされているかどうか、モデルの名前が競合しているかどうかを確認します.
データベースとデータベースをロードする補助関数
model,database,dbuil,dbforgeの3つの関数.database=>>は手動でデータベースに接続するために使用されますが、configで自動接続データベースを設定することができます.主にdatabaseフォルダの下のDB関数を呼び出すことができます.dbutil=>データベースツールクラス(utilityクラス)をロードするための関数です.このクラスには、データベースをエクスポートする
データベースの部分については、後で見たときに具体的に分析します.
ビューとファイルをマウントする関数
いずれも
変数の設定と取得変数(
helper、helpers、language、config、driver
このいくつかの関数は一緒に言って、このいくつかの関数の形式と使い方はすべて類似しています;
パッケージパスの追加/取得/削除;構造は言うまでもなく、CIはファイルと関数の命名と細部の処理において開発者の参考に値すると思います.
congfig/autoloadで設定された自動ロードが必要なクラスをマウントし、initializeで呼び出す.
の3つの補助関数
このうち
PS:
この類はとても重要で、簡単ではありません;長い間読んでいましたが、どの言葉もはっきり言えませんでしたが、よく読みます.
$this->load->view()
メソッドを記述し、__construct
でよく使われている$this->load->helper(url)
は、ここで定義されています.さらに、私たちがmodelをloadした後、$this->some_model
を直接使用して呼び出すことができ、Loaderクラスと大きな関係があります.もちろんこの部分も一番説明しにくいと思いますが、大雑把に説明しましょう.
最初のパラメータは出力状態をマークするために使用され、これがOutputクラスに着いたときに見に行きます(私もこのパラメータの使用場所を具体的に探していませんが、現在は字面の意味から推測しています).
残りのいくつかのパラメータもよく理解されており、4つのpaths文字があり、対応するファイルのパスを記録するために使用されます.残りもクラスや変数などの情報を格納するために使用されます.具体的な用途は関数に分析してもいいです.
コンストラクション関数では、上記で定義した変数を初期化します.このうち
_ci_ob_level
はob_get_level
関数を直接呼び出し、commonクラスのis_loaded
が返した結果は_base_classes
(CIのコアモジュールがロードされる前にロードされるベースクラス)に与えられる.次にis_loaded
の方法を書き直した.クラスの重複ロードを回避します.この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
関数を呼び出して、後でこの関数を見に行きます.vars
とget_var
)vars
関数は文字列または配列またはobjectをarrayに変換し、配列から_ci_cached_vars
に存在し、get_var
は_ci_cached_vars
からデータを取り出す.この2つの関数の効果はview
がデータを伝達する方法と同じで、使用するのは比較的少ないようです.このいくつかの関数は一緒に言って、このいくつかの関数の形式と使い方はすべて類似しています;
helper
とhelpers
関数は、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_paths
とremove_package_paths
の構造は基本的に似ており、1つはlibiary、helper、views、configフォルダパスを追加することであり、1つは削除パスであり、array_shift
とarray_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で呼び出す.
このうち
_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 !
この類はとても重要で、簡単ではありません;長い間読んでいましたが、どの言葉もはっきり言えませんでしたが、よく読みます.