在我正在研究的一些代码中,我注意到从foreach
循环外部访问了几个变量。
这可以在此特定应用的codeigniter视图文件中看到。
例如,视图文件:
<?php
foreach ($items as $row):
endforeach;
// HTML / PHP code...
<td>
<?php echo form_checkbox('option_1','1', FALSE); ?>
<?php echo form_hidden('weight_unit', $row->weight_unit); ?>
</td>
// etc...
这有效(即没有错误),但我想知道这是否会被视为不良做法,如果是这样,为什么? (范围等)
有没有人对此有意见,只应在相应的循环中调用变量?
我注意到的另一个问题是视图文件的几个部分是否需要变量:我应该重构多个循环还是应该有一个foreach / endforeach
和文件的开头/结尾。
非常感谢任何建议。感谢。
答案 0 :(得分:3)
答案 1 :(得分:2)
$row
到达您的其他代码时,它将是数组中的最后一项,或者是未设置的。
这是你想要的吗?如果是这样,那么这本身并不坏。但是你至少应该记录该行为的意图,因为它不直观。
更好的做法就像:
foreach ($foo as $bar)
{
// do something
}
$last_bar = isset($bar) ? $bar : null;
显然你的意思是用$last_bar
做点什么。
我注意到的另一个问题是视图文件的几个部分是否需要变量
如果您必须在视图中的不同位置迭代循环,那就没关系。
但是如果你只需要某个数组内部的某些信息,那么你应该将它放在一个易于访问的变量中并使用它。
答案 2 :(得分:2)
这是一种不好的做法。如果记录集长度超过一个项目,则循环遍历所有记录(即使您在循环中不执行任何操作),然后只使用最后一条记录。我不使用CI,但如果这是一个记录集对象,那么应该有一些访问RS中的第一个/最后一个记录或任何其他索引位置。如果您在特定记录之后,您应该使用这些。如果它只是一个数组你可以使用array_pop
如果你不需要保持数组完整,或end
如果你这样做。
此外,在冗长集合的相同上下文中,如果它不是真正的最后一条记录,那么如果记录集长度发生变化,则可能会产生不可预见的后果。
答案 3 :(得分:1)
我说这是非常糟糕的做法 - 如果稍后(几周后)遇到相同的代码并且您需要另一个foreach
完全不同,会发生什么?记录实际foreach
和您的表之间的类型? - 你的$row
变量将具有完全不同的含义 - 当添加更多代码时,这段代码非常容易受到副作用的影响。
此外,很有可能在将来PHP不再支持此行为(这只是我的假设,因为正如您所提到的,$ row变量超出了您使用的范围它)。
作为一些一般原则: