访问PHP foreach循环外的变量

时间:2011-06-15 04:15:58

标签: php refactoring foreach

在我正在研究的一些代码中,我注意到从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和文件的开头/结尾。

非常感谢任何建议。感谢。

4 个答案:

答案 0 :(得分:3)

我能想到这样做的唯一原因是寻找数组的末尾,以便将最后一个成员存储在一个变量中。

您可以使用end()更清楚地完成此操作。

$row = end($items);

答案 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变量超出了您使用的范围它)。

作为一些一般原则:

  • 使用尽可能少的全局变量 - 它们很难跟踪,维护并确保正确的值
  • 尽可能减少变量的范围,并仅在非常明确的范围内使用它们
  • 避免在其他语言中完全不自然的边际用例和所谓的功能
  • 最后,但并非最不重要的,避免原则如果代码难以编写它应该难以阅读 - 这个原则不会保证你的工作,只有你的同事的仇恨