2

codeigniter では、テンプレートは基本的にインクルード ファイルであり、テンプレート入力は連想配列によって利用可能になります。codeigniter はextract()魔法のその部分に使用すると思いますが、これらの変数がグローバルスコープを台無しにするのをどのように防ぐのでしょうか? または、インクルード ファイルに可変スコープの何かがありませんか?

4

2 に答える 2

1

それは確かに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関数のメソッドスコープ内で解決されます。

于 2012-04-20T10:40:00.883 に答える
0

ビューはメソッド内に読み込まれるため、グローバル スコープとの競合はありません。

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

メソッド内にインクルードしても、グローバル スコープとの競合は発生しません: 関数内でインクルードを使用するには?

于 2014-06-20T13:40:00.877 に答える