Break; против продолжения; против возврата;
Я загрузил бесплатный информационный бюллетень, написанный на php, из hotscripts.com
Я немного обновил код, чтобы добавить новую функциональность, и я увидел что-то, чего не понимаю.
В коде я вижу:
foreach() { ...
if() ...
break;
elseif() ...
continue;
}
Я также видел:
function() {
// ...
for($nl = 0; ...
if() ...
return true;
}
Я читал, что break;
остановит цикл, continue
пропустит цикл до следующей итерации, а return
выйдет из функции.
Я не понимаю, зачем кодировать этот стиль? Почему бы не использовать что-то вроде:
function() {
// ...
for($nl = 0; ...
if() ...
$returnValue = true;
else {
$returnValue = false;
}
}
return $returnValue;
}
или та же идея в циклах for?
Ответы
Ответ 1
Использование таких ключевых слов, как break
и continue
, может сделать код намного более удобным для чтения, чем то, что вы предлагаете.
Особенно, если вы вложенные, если /else -statements более одного уровня.
Сравните фрагменты ниже в этом сообщении, что легче читать?
Оба они выводят одну и ту же вещь, а $A
- array (1,2,4,4,3,4)
.
A return
в цикле (внутри функции) может сэкономить драгоценные циклы процессора, если вы знаете, что вам больше не нужно зацикливаться, зачем это делать?
Я слишком крут, чтобы использовать break
/continue
..
$not_even_found = false;
foreach ($A as $v) {
if ($v != 1) {
if ($not_even_found) {
} else if ($v % 2 != 0) {
$not_even_found = true;
} else {
echo "$v\n";
}
}
}
Я хочу иметь читаемый код..
foreach ($A as $v) {
if ($v == 1)
continue;
if ($v % 2 != 0)
break;
echo "$v\n";
}
Ответ 2
Вы кодируете этот стиль, чтобы сохранить ненужные циклы, когда первый раз выполняется условие, вы уже сейчас, когда что-то истинно, и вам не нужно исследовать дальше.
Фактически, если вы вернетесь, остановите цикл. Глупый пример
function in_array($needle, $haystack){
for($i = 0; $i < count($haystack); i++){
if($needle === $haystack[$i]{
return $i;
}
}
return -1;
}
в этом случае, когда условие выполнено, вы возвращаете что-то (true или в этом случае значение счетчика), потому что вам не нужно iterato по всему массиву
Ответ 3
Некоторые из "почему" сводятся к личным предпочтениям. Некоторые из них сводятся к тому, нужно ли делать другие вещи в одной и той же функции до того, как она вернется. Если нет ничего, что нужно сделать, и функция просто должна возвращать истинный или ложный ответ, то непосредственное использование return true;
является наиболее целесообразным механизмом. Если вам еще нужно сделать некоторые другие вещи, даже после принятия решения о том, следует ли возвращать true или нет (например, закрыть дескриптор файла), тогда может потребоваться присвоение ответа переменной, а затем возвращение в конце.