有点奇怪的问题,但请耐心等待。我正在编写一个小型MVC框架,主要用于学习目的。当我加载视图时,我只包含视图文件,然后使用extract($data);
,这样我就可以在视图中使用变量。这就像在我的控制器中一样:
// Assign view variables and load the views
$data = array('title' => 'testing the framework',
'users' => $this->models['Users']->getAllUsers());
$this->loadViews(array('header', 'home', 'footer'), $data);
它完美无缺,但我刚刚发现如果我的项目中有其他变量被称为$title
或$users
,它们将与我{{1}冲突}“ING。这还没有成为一个问题,但我有一种感觉,我需要在它之前处理它。
我发现的唯一解决方案是使用extract()
变量的前缀。我可以在我的模板中使用它们,例如extract()
而不是<?php echo $tpl_whatever; ?>
有人可以提供一些建议吗?也许我可以限制变量范围?
谢谢!
答案 0 :(得分:3)
只有您方法中的变量可能会发生冲突See Variable Scope,但如果发生这种情况,您可以使用EXTR_PREFIX_ALL
之类的额外标记轻松解决extract中的冲突。
您还可以查看EXTR_PREFIX_SAME
,EXTR_SKIP
或EXTR_OVERWRITE
以解决提取过程中可能出现的串通行为
你的变量
$name = "Baba";
$array = array("title" => "Restricting variable use to one file",
"name" => "James Dawson");
示例EXTR_PREFIX_ALL
extract($array,EXTR_PREFIX_ALL,"new");
var_dump($new_title,$new_name,$name);
^------------------------------ it now has prifix
输出
string 'Restricting variable use to one file' (length=36)
string 'James Dawson' (length=12)
string 'Baba' (length=4)
示例EXTR_PREFIX_SAME
extract($array, EXTR_PREFIX_SAME, "prifix");
var_dump($name,$title,$prifix_name);
^------------------ Only Conflict has prifix
输出
string 'Baba' (length=4)
string 'Restricting variable use to one file' (length=36)
string 'James Dawson' (length=12)
答案 1 :(得分:0)
与其他控制器不会冲突,因为您提取的$ data变量是私有的。此外,如果您的变量在您的控制器函数内部有重复,则最后一个声明将是要使用的声明。