Доступ к переменным вне цикла foreach PHP - PullRequest
3 голосов
/ 15 июня 2011

В некотором коде, над которым я работаю, я заметил, что к нескольким переменным обращаются снаружи из 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 ]

3 голосов
/ 15 июня 2011

Единственная причина, по которой я мог подумать, это поиск конца массива, чтобы вы могли сохранить его последний член в переменной.

Вы можете сделать это более понятным с помощью end().

$row = end($items);
2 голосов
/ 15 июня 2011

Это плохая практика.Если набор записей длиннее, чем один элемент, то вы просматриваете все записи (даже если вы ничего не делаете в цикле), а затем просто используете последнюю запись.Я не использую CI, но если это объект набора записей, должен быть какой-то доступ к первой / последней записи или любой другой позиции индекса в RS.Вы должны использовать их, если вы после определенной записи.Если это просто массив, вы можете использовать array_pop, если вам не нужно сохранять массив нетронутым, или end, если вы это делаете.

Кроме того, в том же контексте длинного набора, если это не последняя запись, которую вы после этого могли иметь непредвиденные последствия, если длина набора записей изменяется.

2 голосов
/ 15 июня 2011

$row будет последним элементом в массиве или не будет установлен, когда он достигнет другого вашего кода.

Ты этого хочешь? Если так, то это неплохая практика, как таковая. Но вы должны, по крайней мере, документировать, что поведение предназначено, потому что оно не интуитивно понятно.

Лучшая практика - это что-то вроде:

foreach ($foo as $bar) 
{
  // do something
}
$last_bar = isset($bar) ? $bar : null;

Там очевидно, что вы хотите что-то сделать с $last_bar.

Еще одна проблема, которую я заметил, - если переменная требуется в нескольких частях файла представления

Если вам нужно повторить цикл в разных местах вашего представления, тогда ничего страшного.

Но если вам просто нужен определенный фрагмент информации внутри какого-либо массива, вам нужно вставить его в легкодоступную переменную и использовать его вместо этого.

1 голос
/ 15 июня 2011

Я бы сказал, что это действительно плохая практика - что произойдет, если позже (через несколько недель) вы столкнетесь с одним и тем же фрагментом кода и вам понадобится еще один foreach на совершенно разных типах записей между фактический foreach а твой стол? - ваша переменная $row будет иметь совершенно другое значение - этот фрагмент кода очень восприимчив к побочным эффектам при добавлении большего количества кода.

Кроме того, существует высокая вероятность того, что в будущем это поведение больше не будет поддерживаться PHP (это мое предположение, потому что, как вы упомянули, переменная $ row находится вне области, где вы используете он).

Как некоторые общие принципы:

  • используйте как можно меньше глобальных переменных - их трудно отслеживать, поддерживать и обеспечивать правильные значения
  • максимально уменьшить область видимости переменных и использовать их только в очень четких областях
  • избегать крайних вариантов использования и так называемых функций , которые совершенно неестественны в других языках
  • В заключение, но не в последнюю очередь, избегайте принципа , если код было трудно писать, его должно быть трудно прочитать - этот принцип не обеспечит вам работу, только ненависть ваших коллег
...