PHP 是一门弱类型语言,弱类型语言最重要的原因:隐式类型转换。
最主要的表现是赋值、计算和比较:
赋值:
$a = 1; // int
$a = '1'; // string
上面例子中 $a 的类型是随着赋值的类型改变而改变的,你肯定知道这在 C 语言中是不行的,因为 C 语言中变量类型都是声明的时候确定的,确定下来之后就不能改变。
计算:
$a = 1;
$b = '2';
echo $a + $b; // 结果是 3
类似的代码在 Python 中也是不行的,你会得到一个这样的错误:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Python 也是强类型语言,不会对变量的类型进行推断,所以就直接抛了错误给你。但是 PHP 是怎么做的呢?
Python 中连接字符串也是使用 +,但是 PHP 需要用 .。在 PHP 内部,当你使用 + 的时候,符号两边的变量都会先被转换成数字类型(浮点、整型),同理,使用 . 的时候,符号两边实际上都会先被转换成字符串。因为 Python 不需要进行转换,遇到数字计算,遇到字符串连接就行了。
这个转换过程也是很有意思的:
$a = 1;
$b = '2';
echo $a + $b; // 3
$b = 'a2';
echo $a + $b; // 1
$b = '2a';
echo $a + $b; // 3
看到上面你应该已经猜出来了:字符串是从前往后搜索直到遇到一个非数字字符为止。
下面我们来说这里会遇到的情况:比较。
== 和 === 包括 != 和 !== 的区别其实你已经猜到了,一个会比较类型,一个不会比较类型。在 PHP 内部的描述中用 equal 和 identical 这两个单词来描述。感受一下区别。
准确的顺序是:=== 和 !== 是先判断类型是否一样,再比较具体的值。如果类型都不一样,那也没必要继续比较了。这意味着即使是 1.0 === 1 得到的也会是 false,因为类型不同。
其实 == 也是要检查类型的,不过动作却是:它会先根据操作符两边变量类型的情况做出判断对变量先做隐式的转换然后再进行比较!这里我不告诉你转换的顺序,但是基本的一些你应该知道:
0 == false; // true
'1' == 1; // true
null == false; // true
null != 'null'; // true
还有你可能不知道的,比如:
123 == '123abc'; // true
'0e123' == '0e456'; // true
到这里这个问题基本上清楚了。因为 '0' == false 是成立的,这就是要用 !== 的原因。
话说回来 strtok 其实本身是个奇怪的函数,这是个自带迭代的函数。如果使用 != 来判断, 就无法准确的取出 strtok('hello world 0', ' ') 这个分解的第三段 0。