我正在构建自己的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);
}
}
它的工作方式与预期一致。但是,当我设置这样的模板视图时,事情变得很奇怪:
loadView('layout/header.php');
loadView($view);
loadView('layout/footer.php');
它被称为这样($user
是一个对象):
$data['view'] = 'login/showUser.php';
$data['user'] = $user;
loadView('layout/template.php', $data);
$view
变量在模板文件中设置并加载正确的视图。但是,$user
变量无法进入仅包含此代码的动态加载视图:
<p>User ID: <?php echo $user->id; ?></p>
我可以在CodeIgniter中执行此操作,我发现它有点奇怪,因为在对模板的第一个$view
调用中提取$user
和loadView()
变量时,它们应该可用到下一个视图,它只是包含在范围内。
我忽略了什么?
答案 0 :(得分:1)
每个loadView()调用都有自己的本地作用域,不在loadView()的不同调用之间共享。在CodeIgniter中,这可能有效,因为它的视图渲染器将变量存储在某个静态存储中。您需要在每个视图中显式传递所需的所有变量,或者需要向loadView()添加静态存储,如下所示:
function loadView($view, $variables = array())
{
static $static_vars = array();
$static_vars = array_merge($static_vars, $variables);
...
extract($static_vars); // instead of extract($variables);
...