PHP类型的杂耍和递减运算符


PHP type juggling and decrement operator

我正在PHP中玩for-loopCLI。我对递减运算符(--)有问题。下面是我的代码,

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

对于任何大于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
"

但是,如果我显式地向int键入cast-cli参数,它会起作用,

<?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$

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

string(2) "3
"

因此,字符串的ascii字符是#51(字符"3"的dec.ascii代码)和#10(换行的dec.AASCII代码)。如果使用递减运算符i--,则字符串将变为#51#09。下一次迭代将其更改为#51#08

第一个字符将不会更改,因为第二个字符将递减。这就是为什么看起来没有颁布法令的原因。

解决方案:

如果您更改

$str = fgets($handle);

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

换行符、制表符等将被移除以使得递减运算符将递减字符CCD_ 10。