2

我正在构建一个小的 MVC 系统(学习),并且在我的视图文件中显示变量时遇到了一些问题。

这是来自我的视图类:

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);
    }
}

像这样使用视图函数:

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

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

现在它应该可以通过做来工作echo $name;,如果你愿意,你可以将它调整到你的 View 类。如果这不起作用,请尝试将 name_view 视图扩展名更改为.php.

于 2009-12-14T13:41:07.780 回答