我改编了一个非常简单的View
类来传递变量,以便Controller
我可以直接调用变量,例如View
View
<?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,或者模板可能会使用该$view
var。
- 别担心,只要确保不要分配一个名为 view 的 var。
- 在函数中使用长变量名
out()
,例如$longVarNameSoThatThereWillNotBeCollisions
. - 将函数所需的所有变量分配给
$this->temp
:$this->temp['view']
然后unset($view)
- 以及$this
- 谁在他们的正确头脑中会使用一个名为$this
in的变量View
!