Php 无法在视图中使用变量
我正在构建自己的MVC框架,在将变量发送到视图时遇到了一个问题。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)) {
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(),这确实引入了一个新的作用域。