codeigniter では、テンプレートは基本的にインクルード ファイルであり、テンプレート入力は連想配列によって利用可能になります。codeigniter はextract()
魔法のその部分に使用すると思いますが、これらの変数がグローバルスコープを台無しにするのをどのように防ぐのでしょうか? または、インクルード ファイルに可変スコープの何かがありませんか?
2 に答える
それは確かにextract()を使用します。抽出関数には既存の変数を上書きしないオプションがありますが、デフォルトでは上書きされ、CodeIgniterはこのデフォルトを使用します。
ビューは表面上はアプリケーションの最終エンドポイントであり、ビューを通過するもの以外の変数を使用するべきではないため、これで問題が発生しないようにすることを目的としています。ただし、スコープの衝突をキャッチしたい場合は、次のようにすることができます。
$foo = 'bar';
$data = array('foo' => 'baz');
foreach($data as $key => $val)
if(isset($$key)) { /* throw fatal error */ }
$this->load->view($data);
より技術的で実用的ではない方法で質問に答えるために、上記のコメントは正しいです。変数は、 CI_loaderクラス内の_ci_load関数のメソッドスコープ内で解決されます。
ビューはメソッド内に読み込まれるため、グローバル スコープとの競合はありません。
CodeIgniter は使用していextract()
ます:
https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/Loader.php#L886
ビューを含める CodeIgniter のコード: https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/Loader.php#L910
メソッド内にインクルードしても、グローバル スコープとの競合は発生しません: 関数内でインクルードを使用するには?