今天无意间翻到了《PHP经典实例》中字符串章节中关于Look and Say序列的那个程序:
<?php function lookandsay($s) { //将保存返回值的变量初始化为空字符串 $r = ''; //$m 用于保存我们要查找的字符, //同时将其初始化为字符串中的第一个字符 $m = $s[0]; //$n 用于保存我们找到的$m的数目,将其初始化为1 $n = 1; for($i = 1, $j = strlen($s); $i < $j; $i++){ //如果这个字符与上一个字符相同 if($s[$i] == $m){ //这个字符的数目加1 $n++; }else { //否则,把数据和这个字符追加到返回值 $r .= $n.$m; //把要找的字符设置为当前的字符 $m = $s[$i]; //并把数目重置为1 $n = 1; } } //返回构建好的字符串以及最终的数目和字符 return $r.$n.$m; } for($i = 0, $s = 1; $i <10; $i++) { $s = lookandsay($s); print "$s <br/> "; } ?>
之前看的时候没看懂,觉得第一次输出的数据应该是“11”,而不应该是“1”,然后自信满满的以为程序本身有问题,也没有去深究原因,之后就不了了之了。今天拿出来主要是说说我当初究竟出在哪了。
我们都知道PHP是一个弱类型的语言,声明变量的时候不用标明数据类型,声明函数的时候也不用标明数据类型,久而久之,使我们对于变量的数据类型越来越不敏感了,对于这个程序而言,我的问题就出在了这里:
//同时将其初始化为字符串中的第一个字符 $m = $s[0];
在第一次调用lookandsay()的时候传过来的参数$s的数据类型不是字符串类型,而是整型。php支持将字符串当做一个下标从0开始的数组来处理,使用花括号和下标来读取数据,比如$str{42},但在PHP5.3.0中不推荐使用这种格式,应该用方括号,像这样$str[42],但是如果用[]或{}来读取其它类型的变量(比如整型变量)则只会返回NULL。所以第一次调用函数时只返回一个“1”,当将这个“1”重新赋值给$s时,$s则变成了字符类型。所以第二次调用时返回值为“11”。
所以在使用php编程的时候,不要因为它是弱类型的语言就忽略数据类型对程序执行过程中产生的影响。当然这只是我个人的看法。