2

私は小さな MVC システム (学習) を構築していますが、ビュー ファイルに変数を表示する際に問題があります。

これは私のViewクラスからのものです:

private $vars = array();

    public function __set($key, $value)
    {
        $this->vars[$key] = $value;
    }


    public function __get($key)
    {
        return $this->vars[$key];
    }

    public function __toString()
    {
        return $this->vars[$key];
    }

    public function show($file)
    {
        global $router;
        $folder = strtolower($router->current_controller);

        $path = VIEWPATH.$folder.'/'.$file.'.phtml';
        if ( ! file_exists($path))
        {
            die("Template: $file, not found");
        }
        include ($path);
    }

そして、ここに私のコントローラーからのものがあります:

$test = new View();
$test->name = 'karl';
$test->show('name_view'); 

ビューファイル (name_view)

echo $name // doesn't work
echo $this->name // Works

私は何を間違っていますか?おそらく私は何かをグローバルにする必要がありますか?

THX / トバイアス

編集: ビュー ファイルをインクルードする直前に、ビュー クラスの vars 配列を抽出したところ、うまくいきました。

4

1 に答える 1

6

__toString() に $key はありません!

また、__toString() はパラメーターを受け入れません!

これでテストします:

public function __toString()
{
    return json_encode($this->vars);
}

編集後、問題が __toString() メソッドにないことに気付きました (使用していないので削除できます)。あなたecho $this->nameの場合、ビュー内から変数を表示するのは正しい方法ですが、やりたいだけのecho $name場合は、別のアプローチを提案できますか?

function View($view)
{
    if (is_file($view) === true)
    {
        $arguments = array_slice(func_get_args(), 1);

        foreach ($arguments as $argument)
        {
            if (is_array($argument) === true)
            {
                extract($argument, EXTR_OVERWRITE);
            }
        }

        require($view);
    }
}

View 関数を次のように使用します。

$data = array
(
   'name' => 'karl',
);

View('/path/to/your/name_view.phtml', $data);

必要echo $name;に応じて View クラスに適応させることができます。それでもうまくいかない場合は、name_view ビュー拡張子を に変更してみてください.php

于 2009-12-14T13:41:07.780 に答える