PHP类型juggling和decrement运算符

时间:2015-11-19 06:50:06

标签: php type-conversion decrement

我在PHP中使用for-loopCLI。我遇到了减量运算符( - )的问题。以下是我的代码,

<?php

    $handle = fopen("php://stdin","r");
    $str = fgets($handle);
    for($i=$str; $i>0; $i--){   
        var_dump($i);
    }

对于任何数字&gt;它进入无限循环0.以下是输出,

john@doe:/var/www/html/rank$ php 1.php
3
string(2) "3
"
string(2) "3
"
string(2) "3
"
string(2) "3
"
string(2) "3
"
string(2) "3
"

但是如果我明确地将cast cli参数键入int,它就可以了,

<?php

    $handle = fopen("php://stdin","r");
    $str = (int)fgets($handle);
    for($i=$str; $i>0; $i--){   
        var_dump($i);
    }

输出

john@doe:/var/www/html/rank$ php 1.php
3
int(3)
int(2)
int(1)
john@doe:/var/www/html/rank$

我做错了什么或类型杂耍对减量运算符(故意)不起作用?因为它似乎可以使用增量运算符(++),如下所示

<?php

    $handle = fopen("php://stdin","r");
    $str = fgets($handle);
    for($i="1"; $i<=$str; $i++){    
        var_dump($i);
    }

输出

john@doe:/var/www/html/rank$ php 1.php
3
string(1) "1"
int(2)
int(3)
john@doe:/var/www/html/rank$

1 个答案:

答案 0 :(得分:2)

您从文件中获取的$str中有一个换行符:

string(2) "3
"

所以字符串的ascii字符是#51(dec.Charles的ASCII代码&#34; 3&#34;)和#10(dec。用于换行的ASCII代码)。 如果使用减量运算符i--,则字符串将更改为#51#09。下一次迭代会将其更改为#51#08

第一个字符不会被更改,因为第二个字符将被减少。这就是它看起来没有减少的原因。

<强>解决方案:

如果你改变了

$str = fgets($handle);

$str = trim(fgets($handle));

换行符,制表符等将被移除,递减运算符将递减字符#51