PHP свободно набирает в то время как сравнение цикла
Учитывая следующий фрагмент кода:
$i= 11;
function get_num() {
global $i;
return (--$i >= 0) ? $i : false;
}
while($num = get_num()) {
echo "Number: $num\n";
}
Результаты в следующем выводе:
Number: 10
Number: 9
Number: 8
Number: 7
Number: 6
Number: 5
Number: 4
Number: 3
Number: 2
Number: 1
Впрочем, я тоже хочу это вывести Number: 0
- но цикл while оценивает 0
как существо false
Таким образом, цикл никогда не доходит до этой точки. Как заставить цикл завершаться только по явному false
?
4 ответа
while( ($num = get_num()) !== false ) {
extra = принудительно проверяет тип.
Я заметил, что вы используете global
, Некоторые разработчики кричат об использовании global
когда не нужно. Кроме того, вы можете опустить скобки, если вы пишете false!==
до вашего $num
декларация (ничего страшного, просто записка).
Опция 1
function get_num() {
static $i=11; // effectively only declare the value once
return (--$i >= 0) ? $i : false;
}
while(false!==$num=get_num()){
echo "Number: $num\n"; // $i is NOT available outside the scope of the function.
}
Вариант 2
function get_num($i) {
return (--$i >= 0) ? $i : false;
}
$num=11; // declare in global scope
while(false!==$num=get_num($num)){ // pass it to function as an argument
echo "Number: $num\n";
}
Вы должны сделать сравнение, которое сравнивает типы, а не только значения - что означает использование ===
или же !==
операторы, а не ==
или же !=
,
Итак, вы можете использовать что-то вроде:
while(($num = get_num()) !== false) {
echo "Number: $num\n";
}
С этим, 0
не будет рассматриваться как то же самое, что false
,
Как ссылка: операторы сравнения (цитирование)
$a == $b
: РавноTRUE
если$a
равно$b
,$a === $b
: ИдентичныеTRUE
если$a
равно$b
и они одного типа.
<?php
$i= 11;
function get_num() {
global $i;
return (--$i >= 0) ? $i : false;
}
while(($num = get_num())!==false) {
echo "Number: $num\n";
}
?>