1

有点奇怪的问题,但请耐心等待。我正在编写一个小型 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);

它工作得很好,但我突然想到,如果我在项目的其他地方有任何变量被称为$titleor $users,它们将与我正在执行extract()的内容冲突。这还没有成为问题,但我觉得我现在需要在它出现之前处理它。

我发现的唯一解决方案是为正在extract()编辑的变量使用前缀。所以我可以在我的模板中使用它们,<?php echo $tpl_whatever; ?>而不是<?php echo $whatever; ?>

任何人都可以提供一些建议吗?也许我可以限制变量范围?

谢谢!

4

2 回答 2

3

只有方法中的变量可能有冲突参阅变量范围,但如果发生这种情况,您可以使用额外的标志(例如.EXTR_PREFIX_ALL

您还可以查看EXTR_PREFIX_SAME或解决提取过程中可能存在的串通问题EXTR_SKIPEXTR_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)
于 2012-10-21T14:26:02.383 回答
0

不会与其他控制器发生冲突,因为您提取的 $data 变量是私有的。此外,如果您的变量在控制器函数中重复,则最后一个声明将是要使用的声明。

于 2012-10-21T14:27:09.760 回答