ホームページ >バックエンド開発 >PHPチュートリアル >CI ロードプロセスの概要、CI ロード_PHP チュートリアルの概要
暇だったので試してみることにしました。
CI (CodeIgniter) は私が初めて触れたフレームワークで、これまで断片的な方法しか使っていません。その過程をまとめてみたいと常々思っているのですが、いろいろな「理由」でいつも行き詰ってしまいます。他の人の図がまとまっていくのを見ると、やる気がなくなってくるので、記念にコードから書いていきます。
オンライン ユーザー マニュアルを見ると、CI (最新バージョン 2.2.1) をダウンロードし、www ディレクトリなどのマシンに解凍すると、ルート ディレクトリ名 (元の名前 CodeIgniter-2.2) を変更できることもわかります。 -stable は長すぎます)、初期ディレクトリ ファイルは次のとおりです。もちろん、これは Windows 上です。
localhost/ci/index.php などにアクセスすると、CI のデフォルトのようこそページが表示されます
このページを段階的に読み込むにはどうすればよいですか?最初にアクセスするのは、index.php スクリプトです
1 php 2 3 /* 4 *------------------------------------------ ------------------ 5 * アプリケーション環境 6 *------------------------------------------ ------------------- 7 * 8 * 状況に応じて、さまざまな設定をロードできます 9 *現在の環境。環境設定も影響する 10 * ログ記録やエラー報告など。 11 * 12 * これは任意に設定できますが、デフォルトの使用法は次のとおりです。 13 * 14 * 開発 15 * テスト中 16 * 制作 17 * 18 * 注: これらを変更する場合は、以下の error_reporting() コードも変更してください。 19 * 20 */ 21 define('環境', '開発'); 22 /* 23 *------------------------------------------ ------------------ 24 * エラー報告 25 *------------------------------------------ ------------------- 26 * 27 * 環境が異なれば、必要なエラー レポートのレベルも異なります。 28 * デフォルトでは、開発ではエラーが表示されますが、テストとライブではエラーが表示されません。 29 */ 30 31 if (定義('環境')) 32 { 33 スイッチ (環境) 34 { 35 ケース「開発」: 36 エラー報告(E_ALL); 37 休憩; 38 39 ケース 'テスト': 40 ケース '生産': 41 エラー報告(0); 42 休憩; 43 44 デフォルト: 45 exit('アプリケーション環境が正しく設定されていません。'); 46 } 47 } 48 49 /* 50 *------------------------------------------ ------------------ 51 * システムフォルダー名 52 *------------------------------------------ ------------------- 53 * 54 * この変数には、「システム」フォルダーの名前が含まれている必要があります。 55 * フォルダーが同じディレクトリにない場合はパスを含めます 56 * このファイルとして。 57 * 58 */ 59 $system_path = 'システム'; 60 61/* 62 *------------------------------------------ ------------------ 63 * アプリケーションフォルダー名 64 *------------------------------------------ ------------------- 65 * 66 * このフロントコントローラーで別の「アプリケーション」を使用したい場合 67 * フォルダーの場合は、ここで名前を設定できるデフォルトのフォルダーです。フォルダ 68 * サーバー上の任意の場所に名前を変更したり、再配置したりすることもできます。 もし 69 * サーバーの完全なパスを使用してください。詳細については、ユーザーガイドを参照してください。 70 * http://codeigniter.com/user_guide/general/managing_apps.html 71 * 72 * 末尾のスラッシュは禁止です! 73 * 74 */ 75 $application_folder = 'アプリケーション'; 76 77 /* 78 * -------------------------------------- ------------------------ 79 * デフォルトのコントローラー 80 * -------------------------------------------- ------------------------ 81 * 82 * 通常は、routes.php ファイルでデフォルトのコントローラーを設定します。 83 * ただし、ハードコーディングすることでカスタム ルーティングを強制することができます。 84 * 特定のコントローラー クラス/関数はここにあります。 ほとんどのアプリケーションでは、 85 * ここではルーティングを設定しませんが、これはそれらのためのオプションです 86 * 標準をオーバーライドしたい特殊な例 87 * 共通の CI インストールを共有する特定のフロント コントローラーでのルーティング。 88 * 89 * 重要: ここでルーティングを設定すると、他のコントローラーは無効になります。 90 * 呼び出し可能。基本的に、この設定によりアプリケーションは 1 つに制限されます。 91 * 特定のコントローラー。 必要に応じて関数名を空白のままにしておきます 92 * URI を介して関数を動的に呼び出します。 93 * 94 * この機能を使用するには、以下の $routing 配列のコメントを解除してください 95 * 96 */ 97 // 「controllers」フォルダーを基準としたディレクトリ名。 空白のままにしておきます 98 // コントローラーが「controllers」フォルダー内のサブフォルダーにない場合 99 // $routing['ディレクトリ'] = ''; 100 101 // コントローラークラスのファイル名。 例: マイコントローラー 102 // $routing['controller'] = ''; 103 104 // 呼び出すコントローラー関数。 105 // $routing['function'] = ''; 106 107 108 /* 109 * -------------------------------------- ------------------------ 110 * カスタム設定値 111 * -------------------------------------- ------------------------ 112 * 113 * 以下の $assign_to_config 配列は動的に渡されます。 114 * 初期化時の構成クラス。これにより、カスタム構成を設定できるようになります 115 * 項目を追加するか、config.php ファイルにあるデフォルトの設定値をオーバーライドします。 116 * これにより、1 つのアプリケーションを複数人で共有できるため便利です。 117 * 複数のフロントコントローラーファイル。各ファイルには異なる内容が含まれます 118 * 設定値。 119 * 120 * この機能を使用するには、以下の $assign_to_config 配列のコメントを解除してください 121 * 122 */ 123 // $assign_to_config['name_of_config_item'] = '設定項目の値'; 124 125 126 127 // -------------------------------------- ------------------------ 128 // ユーザーによる構成可能な設定の終了。 この行より下は編集しないでください 129 // --------------------------------------- ------------------------- 130 131 /* 132 * -------------------------------------- ------------------ 133 * 信頼性を高めるためにシステム パスを解決します 134 * -------------------------------------- ------------------- 135 */ 136 137 // CLI リクエストに対して現在のディレクトリを正しく設定します 138 if (定義('STDIN')) 139 { 140 chdir(ディレクトリ名(__FILE__)); 141 } 142 143 if (realpath($system_path) !== FALSE) 144 { 145 $system_path = realpath($system_path).'/'; 146 } 147 148 // 末尾にスラッシュがあることを確認してください 149 $system_path = rtrim($system_path, '/').'/'; 150 151 // システムパスは正しいですか? 152 if ( ! is_dir($system_path)) 153 { 154 exit(「システムフォルダーのパスが正しく設定されていないようです。次のファイルを開いてこれを修正してください: ".pathinfo(__FILE__, PATHINFO_BASENAME)); 155 } 156 157 /* 158 * -------------------------------------- ------------------------ 159 * パスがわかったので、メインのパス定数を設定します 160 * -------------------------------------------- ----------------------- 161 */ 162 // このファイルの名前 163 define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME)); 164 165 // PHP ファイル拡張子 166 // このグローバル定数は非推奨です。 167 define('EXT', '.php'); 168 169 // システムフォルダーへのパス 170 define('BASEPATH', str_replace("\", "/", $system_path)); 171 172 // フロントコントローラー(このファイル)へのパス 173 define('FCPATH', str_replace(SELF, '', __FILE__)); 174 175 // 「システムフォルダー」の名前 176 define('SYSDIR', trim(strrchr(trim(BASEPATH, '/'), '/'), '/')); 177 178 179 // 「アプリケーション」フォルダーへのパス 180 if (is_dir($application_folder)) 181 { 182 define('APPPATH', $application_folder.'/'); 183 } 184 他 185 { 186 if ( ! is_dir(BASEPATH.$application_folder.'/')) 187 { 188 exit("アプリケーションフォルダーのパスが正しく設定されていないようです。次のファイルを開いてこれを修正してください: ".SELF); 189 } 190 191 define('APPPATH', BASEPATH.$application_folder.'/'); 192 }193 194 /* 195 *------------------------------------------ --- ----------------------- 196 * ブートストラップ ファイルをロードする 197 * -------------------------------------- --- ------------------------ 198 * 199 * そして出発します... 200 * 201 */ 202 require_once BASEPATH.'core/CodeIgniter.php'; 203 204 /* ファイルの終わりindex.php */ 205 /* 場所: ./index.php */ コードを表示21 行目: まず、開発環境である ENVIRONMENT 定数をdevelopmentとして定義します。
行 31 ~ 47: switch ステートメント。現在の環境は開発環境であるため、すべてのレベルのエラーを報告するように設定されています。
49~59行目: $system_path変数はCIのデフォルトのシステムスクリプトディレクトリをsystemとして定義し、61~75行目はメイン開発の現在のデフォルトディレクトリをアプリケーションとして定義します。
77 ~ 105 行目: すべてコメントアウトされています。ここで、デフォルトのディレクトリ名 ($routing['directory'])、コントローラー名 ($routing['directory'])、メソッド名 ($routing[') を強制的に設定できます。通常、これらは applicationconfigroutes.php (下の図) で設定され、アクセスされるウェルカム ページもこのデフォルト コントローラーのウェルカム クラスを通じて実行されます。これは選択的なメソッドとしてのみ使用されます。実際には、必要なメソッドはありません。
108 ~ 129 行目: すべてコメントアウトされており、カスタム構成変数 (CUSTOM CONFIG VALUES) に使用されます。前の記事で述べたように、バックエンド プロジェクトには常に何らかの構成情報がありますが、各プロジェクトまたはフレームワークの読み込みメソッドは異なります。 $ assign_to_config 配列には、$assign_to_config['home'] = 'localhost'; などのカスタム構成情報が格納されます。これがコメント化されている理由は、これが CI ユーザー定義の構成にすぎないためです。情報は通常、applicationconfig ディレクトリの下に配置され、自動読み込み情報 (autoload.php)、一般構成情報 (config.php)、定数 (constants.php)、データベース (database.php) などの別のファイルに保存されます。 . したがって、使用する変数を構成するために、$assign_to_config はデフォルトでは定義されていません。
index.phpファイルの131行目から最後までは主にいくつかのパス変数の定義です。
137 ~ 141 行目: CLI (コマンド インターフェイス ライン) 呼び出しメソッド用に用意されており、Mac/Linux システム上のターミナル コマンドを通じてスクリプトを直接実行します。これは CI 中国語の公式 Web サイト (http://) にあります。 codeigniter.org.cn /user_guide/general/cli.html) も導入されており、STDIN という名前の定数が定義されている場合、実行ディレクトリは現在のファイルが配置されているディレクトリに変更されます。 STDIN はこれまでに登場したことがないため、ここでは実行されません。
143 ~ 155 行目: フレームワークがシステム スクリプトを保存するディレクトリ変数 $system_path を決定します。これは、前の図のシステム ディレクトリです。これが無効な場合、プログラムはここでハングします。
157 ~ 192 行目: いくつかのメイン ディレクトリ定数を定義します。 SELF: 現在のスクリプトのファイル名、EXT: スクリプト拡張子、BASEPATH: システム ディレクトリへのパス、FCPATH: 現在のスクリプトが配置されているディレクトリ、SYSDIR : システム ディレクトリのディレクトリ名。変更しない場合は system になります。
179 ~ 194 行目: APPPATH 定数を定義し、アプリケーションが配置されるディレクトリを決定します。これは、将来主に開発する場所です。is_dir は相対ディレクトリを検出できるので、実際に実行されるものに注意してください。 APPPATH は相対パスを取得します。
最後に、これらの変数 (定数) の値を確認するために print を実行します。その一部はストレージ ディレクトリに関連しています:
202 行目: システム ディレクトリの下のコア クラス ファイル ディレクトリにあるファイルである BASEPATH.'core/CodeIgniter.php' スクリプトをロードし、そのファイルを CI のコア クラス ディレクトリに入力します。
================================================ === ============================================== === ==
1 if ( ! define('BASEPATH')) exit('直接スクリプトアクセスは許可されません'); 2 /** 3 * コードイグナイター 4 * 5 * PHP 5.1.6 以降用のオープンソース アプリケーション開発フレームワーク 6 * 7 * @package CodeIgniter 8 * @author EllisLab 開発チーム 9 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. 10 * @copyright 著作権 (c) 2014 - 2015、ブリティッシュ コロンビア工科大学 (http://bcit.ca/) 11 * @license http://codeigniter.com/user_guide/license.html 12 * @link http://codeigniter.com 13 * @バージョン 1.0 以降 14 * @filesource 15 */ 16 17// -------------------------------------- ------------------------------ 18 19/** 20 * システム初期化ファイル 21 * 22 * 基本クラスをロードし、リクエストを実行します。 23 * 24 * @package CodeIgniter 25 * @subpackage codeigniter 26 * @category フロントコントローラー 27 * @author EllisLab 開発チーム 28 * @link http://codeigniter.com/user_guide/ 29 */ 30 31/** 32 * CodeIgniter バージョン 33 * 34 * @var 文字列 35 * 36 */ 37 定義('CI_VERSION', '2.2.1'); 38 39 /** 40 * CodeIgniter ブランチ (コア = TRUE、リアクター = FALSE) 41 * 42 * @var boolean 43 * 44 */ 45 定義('CI_CORE', FALSE); 46 47 /* 48 * ------------------------------------------- --------- 49 * グローバル関数をロードする 50 * -------------------------------------------- ---------- 51 */ 52 require(BASEPATH.'core/Common.php'); 53 54 /* 55 * -------------------------------------- --------- 56 * フレームワーク定数をロードする 57 * -------------------------------------------- ---------- 58 */ 59 if (定義('環境') および file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php')) 60 { 61 require(APPPATH.'config/'.ENVIRONMENT.'/constants.php'); 62 } 63 他 64 { 65 require(APPPATH.'config/constants.php'); 66 } 67 68 /* 69 * ------------------------------------------- --------- 70 * PHP エラーをログに記録できるようにカスタム エラー ハンドラーを定義する 71 * -------------------------------------------- ---------- 72 */ 73 set_error_handler('_例外_ハンドラー'); 74 75 if ( ! is_php('5.3')) 76 { 77 @set_magic_quotes_runtime(0); // 魔法の名言を殺す 78 } 79 80 /* 81 * -------------------------------------- --------- 82 * subclass_prefix を設定します 83 * -------------------------------------------- ---------- 84 * 85 * 通常、「subclass_prefix」は設定ファイルに設定されます。 86 * サブクラス接頭辞により、CI はコアクラスが 87 * ローカルアプリケーションのライブラリを介して拡張されています 88 *「ライブラリ」フォルダー。 CI では設定項目を次のようにすることができるため、 89 * メインインデックスのデータセットによって上書きされます。 phpファイル、 90 * 先に進む前に、subclass_prefix かどうかを知る必要があります 91 * オーバーライドが存在します。 その場合は、この値を設定します。 92 * クラスがロードされる前 93 * 注: 設定ファイルのデータはキャッシュされるため、キャッシュされません。 94 * ここにロードするのは面倒です。 95 */ 96 if (isset($assign_to_config['subclass_prefix']) AND $assign_to_config['subclass_prefix'] != '') 97 { 98 get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix'])); 99 } 100 101 /* 102 * -------------------------------------- --------- 103 * スクリプトの実行時間制限を十分に設定する 104 * -------------------------------------------- ---------- 105 */ 106 if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0) 107 { 108 @set_time_limit(300); 109 } 110 111 /* 112 * -------------------------------------- --------- 113 * タイマーをスタート...チクタクチクタク... 114 * -------------------------------------- ---------- 115 */ 116 $BM =&load_class('ベンチマーク', 'コア'); 117 $BM->mark('total_execution_time_start'); 118 $BM->mark('loading_time:_base_classes_start'); 119 120 /* 121 * -------------------------------------- --------- 122 * フッククラスをインスタンス化する 123 * -------------------------------------- ---------- 124 */ 125 $EXT =&load_class('フック', 'コア'); 126 127 /* 128 * -------------------------------------- --------- 129 * 「pre_system」フックはありますか? 130 * -------------------------------------- ---------- 131 */ 132 $EXT->_call_hook('pre_system'); 133 134 /* 135 * -------------------------------------- --------- 136 * 構成クラスをインスタンス化する 137 * -------------------------------------- ---------- 138 */ 139 $CFG =&load_class('Config', 'core'); 140 141 // Index.php ファイルに手動で設定する構成項目はありますか? 142 if (isset($assign_to_config)) 143 { 144 $CFG->_assign_to_config($assign_to_config); 145 }146 147 /* 148 * ------------------------------------------- --------- 149 * UTF-8 クラスをインスタンス化する 150 * -------------------------------------------- ---------- 151 * 152 * 注: ここでの順序は UTF-8 としてかなり重要です 153 * クラスは非常に早い段階で使用する必要がありますが、使用できません 154 * UTf-8 がサポートされるかどうかを適切に判断する 155 * Config クラスがインスタンス化された後。 156 * 157 */ 158 159 $UNI =&load_class('Utf8', 'core'); 160 161 /* 162 * ------------------------------------------- --------- 163 * URI クラスをインスタンス化する 164 * -------------------------------------------- ---------- 165 */ 166 $URI =&load_class('URI', 'core'); 167 168 /* 169 * ------------------------------------------- --------- 170 * ルーティングクラスをインスタンス化し、ルーティングを設定する 171 * -------------------------------------- ---------- 172 */ 173 $RTR =&load_class('ルーター', 'コア'); 174 $RTR->_set_routing(); 175 176 // メインインデックスファイルに存在する可能性のあるルーティングオーバーライドを設定します 177 if (isset($ルーティング)) 178 { 179 $RTR->_set_overrides($routing); 180 } 181 182 /* 183 * -------------------------------------- --------- 184 * 出力クラスをインスタンス化する 185 * -------------------------------------- ---------- 186 */ 187 $OUT =&load_class('出力', 'コア'); 188 189 /* 190 * -------------------------------------- --------- 191 * 有効なキャッシュ ファイルはありますか? そうであれば、もう終わりです... 192 * -------------------------------------------- ---------- 193 */ 194 if ($EXT->_call_hook('cache_override') === FALSE) 195 { 196 if ($OUT->_display_cache($CFG, $URI) == TRUE) 197 { 198 終了; 199 } 200 }201 202 /* 203 * -------------------------------------- -------- 204 * xss および csrf サポート用のセキュリティ クラスをロードします 205 * -------------------------------------- --------- 206 */ 207 $SEC =&load_class('セキュリティ', 'コア'); 208 209 /* 210 * -------------------------------------- --------- 211 * 入力クラスをロードし、グローバルをサニタイズする 212 * -------------------------------------- ---------- 213 */ 214 $IN =&load_class('入力', 'コア'); 215 216 /* 217 * -------------------------------------- --------- 218 * 言語クラスをロードする 219 * -------------------------------------- ---------- 220 */ 221 $LANG =&load_class('Lang', 'core'); 222 223 /* 224 * -------------------------------------- --------- 225 * アプリコントローラーとローカルコントローラーをロードします 226 * -------------------------------------- ---------- 227 * 228 */ 229 // 基本コントローラークラスをロードします 230 require BASEPATH.'core/Controller.php'; 231 232 関数 &get_instance() 233 { 234 return CI_Controller::get_instance(); 235 } 236 237 238 if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) 239 { 240 require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; 241 } 242 243 // ローカルアプリケーションコントローラーをロードします 244 // 注: Router クラスは、router->_validate_request() を使用してコントローラー パスを自動的に検証します。 245 // このインクルードが失敗した場合、Routes.php ファイル内のデフォルトのコントローラーが有効なものに解決されていないことを意味します。 246 if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php')) 247 { 248 show_error('デフォルトのコントローラーをロードできません。Routes.php ファイルで指定されたコントローラーが有効であることを確認してください。'); 249 }250 251 include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php'); 252 253 // ベンチマークのマークポイントを設定します 254 $BM->mark('loading_time:_base_classes_end'); 255 256 /* 257 * ------------------------------------------- --------- 258 * セキュリティチェック 259 * -------------------------------------------- ---------- 260 * 261 * アプリコントローラーや 262 * ローダークラスは URI 経由で呼び出すこともできません 263 * アンダースコアで始まるコントローラー関数 264 */ 265 $class = $RTR->fetch_class(); 266 $method = $RTR->fetch_method(); 267 268 if ( ! class_exists($class) 269 または strncmp($method, '_', 1) == 0 270 または in_array(strto lower($method), array_map('strto lower', get_class_methods('CI_Controller'))) 271 ) 272 { 273 if ( ! 空($RTR->ルート['404_override'])) 274 { 275 $x = explode('/', $RTR->ルート['404_override']); 276 $クラス = $x[0]; 277 $method = (isset($x[1]) ? $x[1] : 'インデックス'); 278 if ( ! class_exists($class)) 279 { 280 if ( ! file_exists(APPPATH.'controllers/'.$class.'.php')) 281 { 282 show_404("{$クラス}/{$メソッド}"); 283 } 284 285 include_once(APPPATH.'controllers/'.$class.'.php'); 286 } 287 } 288 その他 289 { 290 show_404("{$クラス}/{$メソッド}"); 291 } 292 }293 294 /* 295 * -------------------------------------- --------- 296 * 「pre_controller」フックはありますか? 297 * -------------------------------------- ---------- 298 */ 299 $EXT->_call_hook('pre_controller'); 300 301 /* 302 * -------------------------------------- --------- 303 * 要求されたコントローラーをインスタンス化します 304 * -------------------------------------- ---------- 305 */ 306 // コントローラーのベンチマークを実行できるように開始点をマークします 307 $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start'); 308 309 $CI = 新しい $クラス(); 310 311 /* 312 * -------------------------------------- --------- 313 * 「post_controller_constructor」フックはありますか? 314 * -------------------------------------------- ---------- 315 */ 316 $EXT->_call_hook('post_controller_constructor'); 317 318 /* 319 * -------------------------------------- --------- 320 * リクエストされたメソッドを呼び出す 321 * -------------------------------------- ---------- 322 */ 323 // 「リマップ」機能はありますか?その場合は、代わりにそれを呼び出します 324 if (method_exists($CI, '_remap')) 325 { 326 $CI->_remap($method, array_slice($URI->rsegments, 2)); 327 } 328 その他 329 { 330 // is_callable() は、プライベートおよびプロテクトの PHP 5 の一部のバージョンで TRUE を返します 331 // メソッドなので、一貫した動作を実現するためにこの回避策を使用します 332 if ( ! in_array(strto lower($method), array_map('strto lower', get_class_methods($CI)))) 333 { 334 // 404 オーバーライドを使用しているかどうかを確認し、使用してください。 335 if ( ! 空($RTR->ルート['404_override'])) 336 { 337 $x = explode('/', $RTR->ルート['404_override']); 338 $クラス = $x[0]; 339 $method = (isset($x[1]) ? $x[1] : 'インデックス'); 340 if ( ! class_exists($class)) 341 { 342 if ( ! file_exists(APPPATH.'controllers/'.$class.'.php')) 343 { 344 show_404("{$クラス}/{$メソッド}"); 345 } 346 347 include_once(APPPATH.'controllers/'.$class.'.php'); 348 設定解除($CI); 349 $CI = 新しい $class(); 350 } 351 } 352 他 353 { 354 show_404("{$クラス}/{$メソッド}"); 355 } 356 }357 358 // 要求されたメソッドを呼び出します。 359 // 存在する URI セグメント (クラス/関数を除く) は便宜上メソッドに渡されます 360 call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2)); 361 } 362 363 364 // ベンチマークの終点をマークします 365 $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end'); 366 367 /* 368 * ------------------------------------------- --------- 369 * 「post_controller」フックはありますか? 370 * -------------------------------------- ---------- 371 */ 372 $EXT->_call_hook('post_controller'); 373 374 /* 375 * -------------------------------------- --------- 376 * 最終的にレンダリングされた出力をブラウザーに送信します 377 * -------------------------------------- ---------- 378 */ 379 if ($EXT->_call_hook('display_override') === FALSE) 380 { 381 $OUT->_display(); 382 } 383 384 /* 385 * -------------------------------------- --------- 386 * 「post_system」フックはありますか? 387 * -------------------------------------- ---------- 388 */ 389 $EXT->_call_hook('post_system'); 390 391 /* 392 * ------------------------------------------- --------- 393 * DB 接続が存在する場合はそれを閉じます 394 * -------------------------------------- ---------- 395 */ 396 if (class_exists('CI_DB') AND isset($CI->db)) 397 { 398 $CI->db->close(); 399 } 400 401 402 /* CodeIgniter.php の終わり */ 403 /* 場所: ./system/core/CodeIgniter.php */ コードを表示CodeIgniter では、最初のスクリプトの説明が表示されます。このスクリプトは、主にベース タイプのロードと要求の実行をシステムによって初期化します。
31-45行:定义了CI_VERSION常量、描写当前の框架バージョン本、CI_CORE常量、目前我也不明確探究过、注释是CI的分支、啥意思?52行:システム核心目录下のCommon.php文件,グローバル関数をロードする,记得前一篇中说到,一般一项目会将很多公共メソッド放一画面中に追加进来,通常取名Utilities.phpまた、Common.php の場合もあり、ここの Common.php もこれに該当し、その例は「すべてのローカル関数を追加する」です。つまり、このスクリプトには 2 つの重要な方法があります。 (前回来说)一つはget_config、個別に出来た如く下
1 php 2 /** 3 * メインの config.php ファイルをロードします 4 * 5 * この関数を使用すると、Config クラスが 6 * はまだインスタンス化されていません 7 * 8 * @アクセス非公開 9 * @return 配列 10 */ 11 if ( ! function_exists('get_config')) 12{ 13 関数 &get_config($replace = array()) 14 { 15 静的 $_config; 16 17 if (isset($_config)) 18 { 19 return $_config[0]; 20 } 21 22 // 設定ファイルは環境フォルダーにありますか? 23 if ( ! 定義('環境') または ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) 24 { 25 $file_path = APPPATH.'config/config.php'; 26 } 27 28 // 設定ファイルを取得します 29 if ( ! file_exists($file_path)) 30 { 31 exit('設定ファイルが存在しません。'); 32 } 33 34 require($file_path); 35 36 // $config 配列はファイル内に存在しますか? 37 if ( ! isset($config) または ! is_array($config)) 38 { 39 exit('設定ファイルが正しくフォーマットされていないようです。'); 40 } 41 42 // 動的に置き換えられる値はありますか? 43 if (カウント($replace) > 0) 44 { 45 foreach ($replace as $key => $val) 46 { 47 if (isset($config[$key])) 48 { 49 $config[$key] = $val; 50 } 51 } 52 } 53 54 $_config[0] =& $config; 55 return $_config[0]; 56 } 57 } コードを表示
主要な config.php ファイルを追加することで、構成ファイルを取得できるようになります。つまり、構成クラスも例示されていません。CI では、中心的な構成クラス CI_Config が構成情報を追加します。 get_config メソッドでも主要な構成情報を取得できます。主要な構成情報であることに注意してください。application/config の下にさらに多くの構成情報ファイルがあります (前述の自動構成量の場合も、CI が構成情報を多数のファイルに分割します)。 get_config で取得できる config.php ファイルがあり、保存されているこのファイルは基本情報であり、他の構成情報を取得する場合は、構成が使用されるようになるため、この構成情報を追加する必要があります。里边。
get_config メソッドを初めて呼び出す場合は、静的変数 $_config が定義されている場合は、その部分配列をインデックス 0 で直接返します。次に、APPPATH/config/ENVIRONMENT/config.php ファイルが存在するかどうかを確認します (既知の ENVIRONMENT 定数値は以前に出力され、変更されていない値は開発です。元のフレームワークにはそのようなディレクトリはないため、application/config/config.phpここにロードされます (このファイルのみがロードされますが、他の構成ファイルはロードされません)。それを開いて、config.php で定義された $config 配列、基本リンク、リンクサフィックス、エンコーディング、言語、キャッシュなどのいくつかの基本定義を確認できます。 、ログ、フックなど。連想配列を渡すと、$_config にキーと値(一時)が追加されます。つまり、get_config メソッドは主に config.php で定義された配列変数を取得します。
get_configに関係するconfig_itemメソッドは、この配列変数内の項目を取得するものです。もう 1 つの重要なメソッドは、load_class です:
1 php 2 /** 3 * クラス登録 4 * 5 * この関数はシングルトンとして機能します。 要求されたクラスがそうでない場合 6 * が存在する場合はインスタンス化され、静的変数に設定されます。 ある場合 7 * 以前にインスタンス化された変数が返されます。 8 * 9 * @access public 10 * @param string リクエストされているクラス名 11 * @param string クラスが見つかるディレクトリ 12 * @param string クラス名のプレフィックス 13 * @return オブジェクト 14 */ 15 if ( ! function_exists('load_class')) 16{ 17 function &load_class($class, $directory = 'ライブラリ', $prefix = 'CI_') 18 { 19 static $_classes = array(); 20 21 // クラスは存在しますか? そうなれば終わりです... 22 if (isset($_classes[$class])) 23 { 24 return $_classes[$class]; 25 } 26 27 $name = FALSE; 28 29 // まずローカルのアプリケーション/ライブラリフォルダーでクラスを探します 30 // 次に、ネイティブ システム/ライブラリ フォルダー内にあります 31 foreach (array(APPPATH, BASEPATH) as $path) 32 { 33 if (file_exists($path.$directory.'/'.$class.'.php')) 34 { 35 $name = $prefix.$class; 36 37 if (class_exists($name) === FALSE) 38 { 39 require($path.$directory.'/'.$class.'.php'); 40 } 41 42 休憩; 43 } 44 } 45 46 // リクエストはクラス延長ですか? もしそうなら、私たちもロードします 47 if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php')) 48 { 49 $name = config_item('subclass_prefix').$class; 50 51 if (class_exists($name) === FALSE) 52 { 53 require(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'); 54 } 55 } 56 57 // クラスは見つかりましたか? 58 if ($name === FALSE) 59 { 60 // 注: エラーを避けるために、show_error() ではなく exit() を使用します。 61 // Exceptions クラスを使用した自己参照ループ 62 exit('指定されたクラスが見つかりません: '.$class.'.php'); 63 }64 65 // ロードした内容を追跡します 66 is_loaded($class); 67 68 $_classes[$class] = 新しい $name(); 69 return $_classes[$class]; 70 } 71 } コードを表示
まずコメントを見てください: このメソッドはシングルトンとして機能します。要求されたクラスが以前に存在しない場合、クラスは静的変数としてインスタンス化されます。以前にインスタンス化されていた場合は、そのクラスが直接返されます。その 3 つのパラメーターは、要求されたクラス名、ディレクトリ、およびクラス名のプレフィックスです。ご覧のとおり、デフォルトのディレクトリはライブラリで、アプリケーションとシステムの両方にあります。ここには、カスタム クラス ライブラリや CI に付属するクラス ライブラリ (カレンダー クラスなどのカスタム ツールや CI によって提供されるツールなど) が保存されます。 、暗号化クラス、Ftpクラス、ログクラス、セッションクラス、メール送受信クラス、JavaScriptクラス、ZIP圧縮クラスなど。おそらく、クラスを静的変数としてロードするのと同じように、値の代わりに参照が返されることに気づいたかもしれません。これらの詳細により、最終的にシステム全体のアクセス速度が向上します。
プロセスについて: まず静的配列を定義し、クラスがすでに配列に存在する場合はそれを直接返します。 APPPATH および BASEPATH (これら 2 つの定数値はすでにわかっています) フォルダーの下の $directory (デフォルト値は library) ディレクトリをスキャンして、$class.php ファイルが存在するかどうかを確認します。存在する場合は、標準クラス プレフィックス CI_ を追加します。 (各パラメータのデフォルト値)、クラスが存在するかどうかを確認するときに、ファイルが存在する場合はそのファイルを要求します(ここから、class_exists() がクラスファイルを最初にロードする必要がないことがわかります。クラスは存在します)、ファイルが表示されたらそれをロードすると、breakが飛び出します。最初に APPPATH、次に BASEPATH というスキャン順序に注意してください。最初のパラメータ クラス名のみが渡された場合は、最初に自分で開発したアプリケーション ディレクトリのライブラリを検索し、次にシステム ディレクトリのライブラリに移動します。
CI のコア クラスを拡張 (継承) できるため、APPPATH と BASEPATH のコア クラス (名前の先頭に CI_ が付く) ディレクトリをスキャンした後、APPPATH クラス (先頭に CI_ の付く名前) のライブラリの下にカスタム拡張機能があるかどうかもスキャンする必要があります。デフォルトでは MY_)、存在する場合はそれらをロードし、対応するオブジェクト (拡張クラスがある場合は拡張クラス) をインスタンス化し、それを $_classes 静的配列に格納してオブジェクトを返します。
Common.php について一般的に理解したら、CodeIgniter.php スクリプトに戻ります。
54~66行目: APPPATH.'config/constants.php'スクリプトをロードします。Constants.phpには、名前が示すように、いくつかの定数を集中的に定義するフレームワーク定数が含まれているため、定数を追加するときにここに置くことができます。それらを定義します。
68~78行目:まず、カスタムエラー処理メソッド_Exception_handlerを定義しています。 PHP のバージョンを確認します。5.3 ではない場合は、セキュリティを向上させるために、この構成はバージョン 5.3 で非推奨になりました。
80行目から99行目:これは、前述の$assign_to_configカスタム構成情報配列を$_config配列に一時的に追加したもので、前述したように、$assign_to_configはデフォルトでは定義されていません。は実行されません。
101 ~ 109 行目: カスタム スクリプトの最大実行時間を 300 秒に設定します (わずかに長く、ログを実行する場合はさらに長くなります)
111 ~ 118 行目: コアクラス Benchmark をロードし、2 つのマークポイントを設定します。 Benchmark ベンチマーク テスト クラスは、特定の開始マークと終了マークの間に占有されているメモリ サイズや実行時間などの情報をテストするためのもので、テストには当然 CI でアナライザーと呼ばれるものと組み合わせて使用する必要があります。
120 ~ 132 行目: コアクラス Hooks をロードし、フックし、システムが実行を開始するようにフックを設定します (application/config/config.php 内のフックに関する構成情報がデフォルトで false に設定されているため、実際には実行されません)つまり、フックは有効になっていません)。これは、コントローラーがロードされる前、ロード後など、何かが実行される前に特定のコードの実行を開始し、コントローラーがロードされると指定されたコードを実行するトリガーと同等です。ここでは、デフォルトでは実行されない pre_system (システム実行前) 拡張機能の呼び出しを試みます。
134 ~ 145 行目: 他の必要な構成情報をロードするために使用される構成クラスであるコア クラス Config をロードします。配列が定義されている場合は、その構成情報を $assign_to_config 配列に再度ロードします。
147 ~ 159 行目: コア クラス Utf8、エンコーディング クラスをロードします。
161 ~ 166 行目: コアクラス URI、ルーティングをロードします。
168 ~ 180 行目: コアクラス Router、パス処理クラス、および _set_routing メソッドをロードして、アクセス パスを設定します。パス構成配列 $routing (デフォルトでコメントアウトされると記載) が定義されている場合、デフォルトのルーティング構成は上書きされます。存在しないスクリプト パスを入力すると、このステップで停止し、404 のレポートが開始されます。もちろん、ルーター内のメソッドで処理する必要があります。
Routerクラスには、そのメンバーとしてURIが存在しており、実際の処理メソッドはURIクラス内にありますが、CIのアクセスメソッドはデフォルトでsegment形式になっているといわれています。検索エンジンに有利になります。単純なアクセス メソッドは、localhost/ci/index.php/Controller/Function/Arguments です。これらは、アクセス フォームを解析して、必要なコントローラ、呼び出されるメソッド、および提供されたパラメータ リストを取得します。もちろん、従来のメソッドも有効にすることができます。 . クエリ文字列形式。具体的な方法は少し複雑です。
187 行目: コアクラスの出力をロードします。
189 ~ 200 行目: Hooks クラスと Output クラスを使用して、キャッシュがあるかどうかを検出します。キャッシュがある場合は、キャッシュ ページが直接出力され、スクリプトが飛び出します。 CI導入のアプリケーションフローチャート部分でパス処理後、キャッシュがあればそのまま出力するのもこれが理由です。
207 行目: コアクラス Security をロードします。
214 行目: コアクラスの入力をロードします。
221 行目: コアクラス Lang、言語処理をロードしています。
行 229 ~ 235: すべてのコントローラーの基本クラスであるコア クラス Controller をロードします。また、get_instance グローバル メソッドはそのインスタンスも取得できます。Controller の優れた点は、load_calss (デフォルトのディレクトリ (APPPATH および BASEPATH) 内のツール ライブラリはすべて、オブジェクトおよびその属性メンバーとしてインスタンス化されます。したがって、ここで get_instance メソッドによって取得されるインスタンスは、CI ではスーパー オブジェクトとも呼ばれます。これは、このオブジェクトを通じて、以前にロードされたすべてのオブジェクト インスタンスを取得できるためです。
行 238 ~ 242: 前のステップでコア クラス CI_Controller のカスタマイズされた拡張クラス ファイルをロードします (拡張した場合、デフォルトは MY_Controller です)。
行 243 ~ 251: コア クラス Router のインスタンスを通じて、現在アクセスされているコントローラーのディレクトリとクラス名を抽出します。存在する場合は、デフォルトのウェルカムがロードされます。コントローラーファイルはここにロードされます。もちろん、コントローラー クラス ファイルを自分で定義してそれにアクセスする場合、それもここに含まれます (Router クラスを通じてサブディレクトリ $RTR->fetch_directory() を抽出します。存在する場合は、クラス名 $RTR-> を抽出します) ;fetch_class() (探してください)、246 行目の if ステートメント ブロックは、このクラス ファイルが存在するかどうかを確認します。
252 行目: 基本コアクラスのロードの終了を示すベンチマーク終了マークを設定します (これらのテストはデフォルトでは実行されません)。
256~292行目:セキュリティチェック。まず、Routerクラスで実行するクラス名とメソッド名を取得し、if条件の3つの項目を確認します。 1. 上記の行 243 ~ 251 では、コントローラーに対応するスクリプトを見つけてロードしていますが、これが一致する名前を持つ単なる空のスクリプトである場合はどうなるでしょうか。内部に何も書かれていない場合は動作しないので、クラスの定義が存在するかどうかを確認する必要があります (class_exists)。 2. アンダースコア _ で始まるメソッド名は実行できず、直接エラーが報告されます。は CI 独自のルールです。つまり、クラスで定義された _ で始まるメソッドは、パブリック アクセス属性であっても機能しません (1 つの _remap を除く) 3. クラス内のメソッドが同じである場合。 name をルート コントローラーのコア クラスのメソッドとして使用すると、機能しません。メソッド名を定義するときは、イメージだけを持ってください。 if を入力すると 404 が発生する可能性があります。
298 行目: Hooks クラスは、pre_controller (コントローラーが実行される前) 拡張機能を呼び出そうとしますが、これはデフォルトでは使用できません。
行 301 ~ 309: ベンチマーク テスト クラスは、コントローラーの実行時間をテストするための開始点マークを設定し (デフォルトではテスト情報は表示されません)、以前にロードされたコントローラー クラスをインスタンス化します。デフォルトは Welcome です。
315 行目: フックは、(呼び出されたコントローラー クラスが構築された後) post_controller_constructor の拡張機能を実行しようとしますが、これはデフォルトでは使用できません。
行 317 ~ 364: 指定されたコントローラー クラスの指定されたメソッドの呼び出しを開始します (もちろん、これはデフォルト コントローラーのデフォルトのメソッド インデックスです)。このプロセスを見てください。まず、コントローラー クラスに _remap メソッドがある場合は、それを呼び出します。これは、_remap のメソッドを除くものです。この再マッピング方法では、それを調整するだけです。デフォルトの Welcome コントローラーには _remap メソッドがありません。else に if が存在します。そうでない場合は、404 になります。