Php 无法在视图中使用变量

Php 无法在视图中使用变量,php,model-view-controller,scope,Php,Model View Controller,Scope,我正在构建自己的MVC框架,在将变量发送到视图时遇到了一个问题。loadView()如下所示: function loadView($view, $variables = array()) { $file_path = APPLICATION_PATH . 'views/' . $view; if (file_exists($file_path)) { if (is_readable($file_path)) {

我正在构建自己的MVC框架,在将变量发送到视图时遇到了一个问题。
loadView()
如下所示:

function loadView($view, $variables = array())
{
    $file_path = APPLICATION_PATH . 'views/' . $view;

    if (file_exists($file_path))
    {
        if (is_readable($file_path))
        {
            if (! empty($variables)) extract($variables);
            include($file_path);
        }
        else
        {
            throw new Exception('Could not read view from ' . $file_path);
        }
    }
    else
    {
        throw new Exception('Could not load view from ' . $file_path);
    }
}
function loadView($view, $variables = array())
{
    static $static_vars = array();
    $static_vars = array_merge($static_vars, $variables);
    ...
    extract($static_vars); // instead of extract($variables);
    ...
它就像预期的那样工作。但是,当我设置这样的模板视图时,事情变得很奇怪:

loadView('layout/header.php');
loadView($view);
loadView('layout/footer.php');
它的名称如下(
$user
是一个对象):

$view
变量在模板文件中设置并加载正确的视图。但是,
$user
变量无法进入仅包含以下代码的动态加载视图:

<p>User ID: <?php echo $user->id; ?></p>
用户ID:

我可以在CodeIgniter中实现这一点,我发现这有点奇怪,因为当在对模板的第一次
loadView()
调用中提取
$view
$user
变量时,它们应该可以用于下一个视图,而下一个视图只是包含在范围中

我忽略了什么?

每个loadView()调用都有自己的本地作用域,这些作用域不会在loadView()的不同调用之间共享。在CodeIgniter中,这可能会起作用,因为它的视图渲染器将变量存储在一些静态存储中。您需要显式地传递每个视图中需要的所有变量,或者需要向loadView()添加静态存储,如下所示:

function loadView($view, $variables = array())
{
    $file_path = APPLICATION_PATH . 'views/' . $view;

    if (file_exists($file_path))
    {
        if (is_readable($file_path))
        {
            if (! empty($variables)) extract($variables);
            include($file_path);
        }
        else
        {
            throw new Exception('Could not read view from ' . $file_path);
        }
    }
    else
    {
        throw new Exception('Could not load view from ' . $file_path);
    }
}
function loadView($view, $variables = array())
{
    static $static_vars = array();
    $static_vars = array_merge($static_vars, $variables);
    ...
    extract($static_vars); // instead of extract($variables);
    ...

你也可以发布用户类代码吗?如果你一开始的前提是“制作类似CI的东西”,那么你已经做错了。我从来没有说过我这样做,这也是毫无意义的。我知道函数的作用域,但我的编程生涯是从编写代码开始的,比如
$var=1;包括('file.php');//包含:echo$var,就我记忆所及,这是有效的。这一定是因为在本例中,include是在函数内部调用的。顺便说一句,这正是我想要的。谢谢
include()
实际上不是一个函数调用,它实际上是一个语句,不引入新的局部作用域;但是,在外部视图中,您再次调用loadView(),这确实引入了一个新的作用域。