4

演習のために、PHPで小さなMVCフレームワークに取り組んでいます。しかし、PHPは私のControllerクラスを気に入っていないようです。このクラスには、ビューをロードするローダーのインスタンスが含まれています。

abstract class Controller
{
    public $load;
    function __construct($load) 
    {
        $this->load = $load;
    }
    abstract public function index();
}

そこから、すべてのコントローラーのコントローラーをオーバーライドできます。インスタントの場合、私のインデックスコントローラー:

class Index extends Controller
{
    public function index()
    {
        $this->load->view("hello_world");
    }
}

しかし、私がそれを作成するとき:

require 'Controller.php';
require 'Load.php'
require 'controllers/Index.php';
$i = new Index(new Load());
$i->index();

このエラーが発生します:

PHP Fatal error:  Call to a member function view() on a non-object in /var/www/controllers/Index.php on line 7

助けてくれませんか?コンストラクターでロードを設定し、ロードクラスにviewというメ​​ソッドがあることはわかってますが、なぜこのエラーが発生するのですか?また:ちょうど良い測定のために、クラスをロードします

class Load
{
    public function view($filename, $data = null)
    {
        if(is_array($data)) extract($data);
        include ROOT.DS.'views'.DS.$filename.'.php';
    }
}
4

2 に答える 2

8

問題はこのコードにあり、それは必ずしも明白ではありません:

class Index extends Controller
      ^^^^^
{
    public function index()
                    ^^^^^
    {
        $this->load->view("hello_world");
    }
}

これは同じ名前であるため、PHP4の下位互換性のあるコンストラクターです。その場合、親のコンストラクターは呼び出され$loadず、設定されず、関数は定義されません。

これを知っていると、次のような多くの解決策があります。

namespace DelishusCake;

名前空間を導入する

これにより、問題が自動的に修正されます。これをファイルの上に配置する必要があります。

class Index extends Controller
{
    public function index($load = NULL)
    {
        isset($load) && $this->load = $load;
        $this->load->view("hello_world");
    }
}

PHP4の下位互換性のあるコンストラクターを機能させる

または:

class MyIndex extends Controller
{
    public function index()
    {            
        $this->load->view("hello_world");
    }
}

クラスの名前を変更する

または:

class Index extends Controller
{
    public function __construct($load) {
        parent::__construct($load);
    }
    public function index()
    {            
        $this->load->view("hello_world");
    }
}

PHP 5コンストラクターを追加し、親のコンストラクターを呼び出します

同じ名前なので、これだけが必要であることに注意してください。詳細な説明は、PHPマニュアルのコンストラクタとデストラクタページにもあります。

于 2012-06-17T17:57:09.747 に答える
2

親クラスをインスタンス化する必要があります。

class Index extends Controller
{
    public function __construct($load) {
      parent::__construct($load);
    }

    public function index() {
      $this->load->view("hello_world");
    }
}
于 2012-06-17T17:55:37.523 に答える