在我看来,我测试if (isset($winner))
. 但是,视图是循环重印的,我无法清除它以进行后续测试。
如何实例化一个新视图或清除/取消设置它的控制器给出的变量?
我很欣赏 View 的范围很广,但这似乎是 Codeigniter 中的一个错误。
控制器:
for($i=0; $i < 100; $i++) {
$test = $this->prizedistributor->isWinner();
echo $this->load->view("simulateResponse", $test, TRUE);
unset($test['winner']); // this does not work
}
看法:
<? if (isset($winner)):?>
WINNER!
<? else: ?>
LOST!
<? endif; ?>
<?php unset($winner); // this does not work! ?>
结果:
说$i==40
是唯一的赢家,尽管控制器总是默认布尔值为假,但视图会将所有 $i > 40 报告为赢家。
更新
我知道测试 if(empty($test)) 允许 View 正确报告。但是,我的问题是如何取消设置该变量(并从内存中清除它)。这个问题很大程度上源于使用 HMVC(模块化代码点火器)时的其他类似问题。但是,在此处发布该代码过于复杂,无法说明相同的范围问题。
很多人一直在质疑上面无关的奖品分发者。所以这里有一个更简单的代码示例来说明示例问题:
控制器
function testScope() {
for($i=0; $i < 10; $i++) {
if($i == 5)$winner = array('winner' => true);
else $winner = array();
echo $this->load->view("testScope", $winner, TRUE);
}
}
看法
<?= (isset($winner)) ? "WINNER!<br>" : "LOST!<br>"; ?>
输出
丢失的!丢失的!丢失的!丢失的!丢失的!优胜者!优胜者!优胜者!优胜者!优胜者!
可能的答案:
我查看了 codeignitersystem/core/Loader.php
并在第 800 行附近找到了函数_ci_load
缓存变量。他们的推理是:
您可以使用专用的 $this->load_vars() 函数或通过此函数的第二个参数设置变量。我们将合并这两种类型并缓存它们,以便嵌入在其他视图中的视图可以访问这些变量。
这提出了一个很好的观点,也是我对 codeigniter 的欣赏。但问题仍然存在,我们如何才能两者兼得?可能是第四个可选参数来跳过这个捕获?
前任。loader->view("testScope", $winner, TRUE, FALSE);
???