4

フッター/ヘッダーと一緒にメインコンテンツをロードするビューアーヘルパー関数があります。メイン コンテンツ ビューの変数に同じ名前を共有するヘッダーの配列のキーをロードすると、バグ/予期しない動作が発生しました。ヘッダーとメイン コンテンツの両方に同じ配列がロードされます。

$data同じ配列がヘッダーとメインコンテンツにも送信されたので(前述のように)、それは正常だと思いました。したがって、変数は当然両方のビューに存在します。でもまあ、そうではなかった。データをヘッダーに送信した後に変数の設定を解除$dataし、メイン ビューにデータを送信するときに変数を再作成しましたが、それでも問題は修正されません。

このバグ/予期しない動作の簡単な例を作成しました。

という名前のこのビューを検討してくださいtest

<?php 
echo $some_data;  

そして、このコントローラー:

class Test extends CI_Controller {

    function index() {

    $data['some_data'] = 'Some data.';
    $this->load->view('test', $data);
    /* 
     * Output:
     * Some data.
     */
    unset($data);
    unset($data['some_data']);//Just to make sure it's not PHP's fault.
    $this->load->view('test');
    /*
     * Output:
     * Some data.
     * 
     * Even though the $data variable is unsetted AND not passed!
     */

    $different_data = array();

    $this->load->view('test', $different_data);     
    /*
     * Output:
     * Some Data.
     * 
     * Still outputs the same thing, even though
     * I'm sending different array(and the $data array is unstted).
     * 
     */ 

    }
}  

注: コード全体Some data.で 3 回出力されます。

この問題を解決する唯一の方法は、別の配列を送信し、配列キー ( some_data) を古い配列をオーバーライドする別のものに設定することです。

では、これはバグなのか、それとも CodeIgniter の連中が作ったものなのか?

4

3 に答える 3

1

これは予期される動作です。

変数が設定されると、コントローラ クラスとそのビュー ファイル内で使用できるようになります。配列を送信することは、ビュー ファイルを呼び出す前に$this->load->view()配列を直接送信することと同じです。$this->load->vars()これにより、コントローラーで複数のビューを使用するほとんどの人にとって物事が簡素化されます。1 つのコントローラーで複数のビュー ファイルを使用していて、それぞれに独自の変数セットを排他的に持たせたい場合は、$this->load->_ci_cached_varsビュー呼び出しの間に配列を手動でクリアする必要があります。

Loader クラスのコード コメントは、これが望ましいデフォルト動作である理由を示す別の状況を説明しています。

//You can either set variables using the dedicated $this->load_vars()
//function or via the second parameter of this function. We'll merge
//the two types and cache them so that views that are embedded within
//other views can have access to these variables.
于 2012-09-02T16:19:21.297 に答える
0

これは CodeIgniter の問題です。送信している変数は、オーバーライドするまでキャッシュされているようです。私はこれに遭遇し、それを確認することができます。

$this->load->view('test', array('some_data' => NULL));

于 2012-09-02T16:07:48.813 に答える