开发者

PHP loose typing in while loop comparison

开发者 https://www.devze.com 2022-12-26 01:38 出处:网络
Given the following code snippet: $i= 11; function get_num() { global $i; return (--$i >= 0) ? $i : false;

Given the following code snippet:

  $i= 11;
  function get_num() {
    global $i;
    return (--$i >= 0) ? $i : false;
  }
  while($num = get_num()) {
    echo "Number: $num\n";
  }

Results in the following output:

Number: 10
Number: 9
Number: 8
Number: 7
Number: 6
Number: 5
Number: 4
Number: 3
Number: 2
Number: 1

How开发者_运维问答ever, I also want it to output Number: 0 - but the while loop evaluates 0 as being false, so the loop never gets to that point. How do I get the loop to terminate only on an explicit false?


while( ($num = get_num()) !== false ) {

extra = forces type check as well.


<?php
  $i= 11;
  function get_num() {
    global $i;
    return (--$i >= 0) ? $i : false;
  }
  while(($num = get_num())!==false) {
    echo "Number: $num\n";
  }
?>


You have to do a comparison that compares the types, and not only the values -- which means using the === or !== operators, instead of == or !=.

So, you could use something like :

while(($num = get_num()) !== false) {
    echo "Number: $num\n";
}

With this, 0 will not be considered as the same thing as false.


As reference : Comparison Operators (quoting)

$a == $b : Equal : TRUE if $a is equal to $b.
$a === $b : Identical : TRUE if $a is equal to $b, and they are of the same type.


I noticed that you are using global. Some devs scream about using global when not necessary. Also, you can leave out the parentheses if you write false!== before your $num declaration (no big deal, just a note).

Option 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.
}

Option 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";
}
0

精彩评论

暂无评论...
验证码 换一张
取 消