0

私のビューは、特定の変数がそれらを呼び出すコントローラーによって定義されることを期待しています。そのため、拡張する独自のコントローラーを作成しました。このコントローラーは、次に拡張しCI_Controllerます。

class MainController extends CI_Controller{

static protected $data_bundle;

/**
All classes that will extend MainController should have their own constructors
calling the constructor of MainController.
*/
public function __construct(){
    parent::__construct();
    $data_bundle["title"] = "";
    $data_bundle["content"] = "";
    $data_bundle["stylesheets"] = array();
    $data_bundle["scripts"] = array();
    $data_bundle["echo_content"] = true;
}

}

したがって、たとえば、プレーンページのコントローラーを次のように定義できます。

class PlainPage extends MainController{
    public function __construct(){
        parent::__construct()
    }

    public function page(){
        parent::$data_bundle["title"] = "Plain Page"
        parent::$data_bundle["content"] = "The quick brown fox jumps over the lazy dog."
        $this->load->view("mainview", parent::$data_bundle);
    }
}

次に、にmainview.php、次のコードがあります。

<?php
        foreach($stylesheets as $style){
            echo '<link rel="stylesheet" type="text/css" href="css/$style" />"';
        }
    ?>

    <?php
        foreach($scripts as $script){
            echo '<script type="text/javascript" src="scripts/$script"></script>"';
        }
    ?>

しかし、次のエラーが発生します。

Message: Undefined variable: {stylesheets|scripts}
Message: Invalid argument supplied for foreach()

parent::__construct()呼び出されたときに$data_bundle配列が初期化されているはずだったのではないですか?変数が未定義であるとCI/PHPが文句を言うのはなぜですか?

4

1 に答える 1

1

self静的プロパティを初期化するときに、親クラスのコンストラクターを見逃しました。

public function __construct(){
    parent::__construct();
    self::$data_bundle["title"] = "";
    self::$data_bundle["content"] = "";
    self::$data_bundle["stylesheets"] = array();
    self::$data_bundle["scripts"] = array();
    self::$data_bundle["echo_content"] = true;
}

ただし、この場合、静的プロパティを使用する必要はありません。コントローラーにはインスタンスが 1 つしかないため、インスタンス プロパティで十分です。

class MainController extends CI_Controller{

protected $data_bundle = array();

/**
All classes that will extend MainController should have their own constructors
calling the constructor of MainController.
*/
public function __construct(){
    parent::__construct();
    $this->data_bundle["title"] = "";
    $this->data_bundle["content"] = "";
    $this->data_bundle["stylesheets"] = array();
    $this->data_bundle["scripts"] = array();
    $this->data_bundle["echo_content"] = true;
}

}

class PlainPage extends MainController{
    public function __construct(){
        parent::__construct()
    }

    public function page(){
        $this->data_bundle["title"] = "Plain Page"
        $this->data_bundle["content"] = "The quick brown fox jumps over the lazy dog."
        $this->load->view("mainview", $this->data_bundle);
    }
}
于 2012-07-15T05:52:07.443 に答える