0

main.controller.php:

final class MainController extends Controller   {

    public function is_locked() {
        $lock = new View('lock');
        Res::render($lock);
    }
}

view.class.php:

final class View {

    private $data;


    public function get_title() {
        return isset($this->title) ? $this->title : DEFAULT_TITLE;
    }
    public function get_layout() {
        return isset($this->layout) ? $this->layout : 'base';
    }
    public function get_layout_path() {
        return SITE_PATH .'app/views/layouts/'. $this->get_layout() .'.layout.php';
    }
    public function get_path() {
        return SITE_PATH .'app/views/' .$this->name .'.view.php';
    }


    public function print_title() {
        echo $this->get_title;
    }

    public function __construct($name) {
        $this->data = array();
        $this->data['name'] = $name;
    }
    public function __set($name, $value) {
        $this->data[$name] = $value;
    }
    public function __get($name) {
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }

        $trace = debug_backtrace();
        trigger_error('Undefined property via __get(): '. $name .' in '. $trace[0]['file'] .' on line' . $trace[0]['line'], E_USER_NOTICE);
        return null;
    }
    public function __isset($name) {
        return isset($this->data[$name]);
    }
    public function __unset($name) {
        unset($this->data[$name]);
    }
}

これが私の応答クラスのrenderメソッドです:

public static function render($view) {
  include_once SITE_PATH .'app/views/layouts/root.layout.php');
}

私のコントローラーの1つから呼び出されました...param$viewは単純なViewオブジェクトです...

これが私のroot.layout.phpです:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title><?php $view->print_title(); ?></title>
</head>

<body>
 root layout
</body>
</html>

含まれているレイアウトファイルから$viewオブジェクトにアクセスできないようです。ばかげた質問かもしれませんが、今のところ、なぜ機能しないのか本当にわかりません...

誰かがその状況でphpがどのように機能するかを私に説明できますか?私が間違っているのは何ですか?

4

1 に答える 1

1

メソッドは複数回呼び出すことができ、最初(「1回」)しか機能しないため、のinclude代わりに使用してください。include_once

PHPのドキュメントには、include(およびinclude_once)の範囲について記載されています。

ファイルがインクルードされると、そのファイルに含まれるコードは、インクルードが発生する行の可変スコープを継承します。呼び出し元ファイルのその行で使用可能な変数は、その時点以降、呼び出されたファイル内で使用可能になります。ただし、インクルードされたファイルで定義されているすべての関数とクラスはグローバルスコープを持っています。

したがって、すべてが渡された$view変数で機能するはずです。

インクルードする前の行で使用可能な変数がインクルードされたファイルで使用可能になることを説明する良い例(ページの最初の例)もあります。

于 2013-01-07T08:43:00.533 に答える