我改编了一个非常简单的View类来传递变量,以便Controller我可以直接调用变量,例如ViewView
<?php echo $name; ?>
并不是
<?php echo $this->name; ?>
所有视图变量都存储在一个名为 vars 的关联数组中,例如$vars['name'] = "test",并具有__set分配变量的函数设置,例如
$v = new View;
$v->name="test";
$v->out();
因此,在out()传递变量并包含我添加的视图 HTML 的函数中:
foreach($this->vars as $key=>$val) {
$$key=$val;
}
include $this->view_file;
然后我测试了如果我$this在模板中使用并添加一个相应的变量会发生什么
$v->this = "test_this";
我的假设是代码将失败,因为$this无法重新分配,或者即使重新分配 -请参阅此处- 代码将失败,因为$this已重新分配所以
include $this->view_file;
行不通!
相反,它奏效了。
,当使用或等于$this直接调用但仍指向原始值时!echo $this;var_dump($this);"test_this"$this->view_file
怎么会这样?
然后我重新测试使用extract($this->vars, EXTR_OVERWRITE)并$this没有被触动!
一般来说,将变量传递给视图并避免函数冲突的正确方法是什么
function out($view, $toString = false)
{
extract($this->vars);
include $view;
}
并且 vars 可能有一个名为 view 或“this”的 var,或者模板可能会使用该$viewvar。
- 别担心,只要确保不要分配一个名为 view 的 var。
- 在函数中使用长变量名
out(),例如$longVarNameSoThatThereWillNotBeCollisions. - 将函数所需的所有变量分配给
$this->temp:$this->temp['view']然后unset($view)- 以及$this- 谁在他们的正确头脑中会使用一个名为$thisin的变量View!