【发布时间】:2013-10-24 23:39:28
【问题描述】:
在我看来,我测试了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>"; ?>
输出
迷路了! 丢失! 丢失! 丢失! 丢失! 优胜者! 优胜者! 优胜者! 优胜者! 赢了!
可能的答案:
我查看了 codeigniter 的 system/core/Loader.php 并发现函数 _ci_load 在第 800 行缓存变量。他们的推理是:
您可以使用专用的 $this->load_vars() 设置变量 函数或通过此函数的第二个参数。我们将合并 两种类型并缓存它们,以便嵌入其他类型的视图 视图可以访问这些变量。
这提出了一个很好的观点,我很欣赏 codeigniter。但问题仍然存在,我们怎样才能两者兼得?可能是第四个可选参数来跳过这个捕获?
例如。 loader->view("testScope", $winner, TRUE, FALSE);????
【问题讨论】:
-
尝试给获胜者一个值并与之进行比较。 $winner == 这个迭代次数。满足条件时设置为0。
-
@KaiQing,这在我的情况下不起作用。获胜者在图书馆内确定。我想我可以传递 $i 和另一个变量,但坦率地说,这并不能回答我的问题。
-
@stormdrain,哈哈。很公平。但是,这里甚至没有回答如何取消设置。除非 wesley murch 的陈述是真的,否则它不可能是真的。无论如何,我在这里为你和其他人加分。
-
我们回答它:“要取消设置 $myvar,你必须明确地这样做:$this->load->view('myview', array('myvar' => null));” ;您必须将
null'd var 发送到视图,否则之前的值将保留在缓存中。 -
@EliATaylor 很有趣。在您发布的链接中,接受的答案是:“如果您正在执行 $whatever = null; 那么您正在重写变量的数据。您可能会更快地释放/缩小内存,但它可能会从真正需要它们的代码中窃取 CPU 周期更快,从而导致更长的整体执行时间。”。无论如何,无效化似乎是更好的选择-如果关注的是内存。即
nullifying 一个 var 将使 PHP 的 gc 比unset()更快地对其采取行动。
标签: php codeigniter scope codeigniter-2