php什么时候代表FALSE,为什么php常常用!==false表示真的,为啥不直接用===true?...

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。

测试

if($res !== false){

echo "未定义通过
";

}else{

echo "未定义不通过
";

}

$res = 0;

if($res !== false){

echo "0数字通过
";

}else{

echo "0数字不通过
";

}

$res = "0";

if($res !== false){

echo "0字符串通过
";

}else{

echo "0字符串不通过
";

}

$res = NULL;

if($res !== false){

echo "NULL通过
";

}else{

echo "NULL不通过
";

}

$res = "";

if($res !== false){

echo "空字符串通过
";

}else{

echo "空字符串不通过
";

}

$res = array();

if($res !== false){

echo "array()通过
";

}else{

echo "array()不通过
";

}

$res = FALSE;

if($res !== false){

echo "FALSE通过
";

}else{

echo "FALSE不通过
";

}

$res = TRUE;

if($res !== false){

echo "TRUE通过
";

}else{

echo "TRUE不通过
";

}

$res = 1;

if($res !== false){

echo "数字1通过
";

}else{

echo "数字1不通过
";

}

验证结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值