php判断一个值是否为0,彻底解决php判断a==0为真引发的问题

本文详细解析了PHP中弱类型语言特性导致的字符串与数字比较时出现的意外情况。当字符串与数字使用`==`比较时,PHP会尝试将字符串转换为数字进行比较。规则包括字符串开头的合法数字会被转换为相应数值,否则为0。举例说明了如'abc'、'1a'等字符串在转换后的结果,并通过多个示例展示了不同类型字符串转换为数字的规则。了解这一机制有助于避免在编程中出现逻辑错误。
摘要由CSDN通过智能技术生成

参考:

ce97a778bb4fc065e86929793b3431a6.png

一、起因经常会遇到 字符串==0 进行逻辑判断时,判断结果尽然为真。

例如下面的代码尽然输出了“字符串a尽然等于0”,刚开始会让人大跌眼镜。但知道了原因之后其实很简单。这一切都是因为php是弱类型语言,当不同类型的值进行==比较的时候会发生类型转换。

if('a'==0){

echo "字符串a尽然等于0";

}

二、原因php虽然是弱类型的语言,但它是有数据类型的。大概分为三种类型:字符串、数字、布尔型。

正常情况下不同类型的值是不能比较的,php 为了比较进行了数据类型转换。把不同类型的值转换为相同类型后再比较。

规则如下:

宽松比较(==)类型转换规则(1)数字和字符串比较,将字符串转为数字,然后进行比较

(2)数字和布尔型比较,将数字转为布尔型,然后进行比较

(3)字符串和布尔型比较,将字符串转为布尔型,然后进行比较。

宽松比较的落脚点只有两个,一个是布尔型,一个是数字。只有当数字和字符串比较的时候,会把字符串转为数字

三、字符串转数字1. 字符串的开始部分决定了它的数字值。

2. 如果该字符串以合法的数字值开始,则使用该数值。否则其值为 0(零)。

3. 合法数字值可以是正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。

四、剖析 'a'==0'a' 这是一个字符串类型。0 是数字类型。使用 == 宽松比较,此时发生类型转换。字符串和数字比较,是将字符串转换为数字然后进行比较的。

运算步骤一:根据字符串转数字的规则,字符串的开始部分决定了它的数字值。该字符串的开头不是数字,则它的数字值为0。

所以'a' 转换为数字类型时,它其实为0了。不仅'a'等于0,'abc','aabbcc' 它们转为数字也是0哦。

运算步骤二:最后比较0是否等于0,结果为真。

五、更多示例

//不带数字的字符串

$a='a';

$b='b';

$c="cc";

var_dump((int)$a); //输出int(0)

var_dump((int)$b); //输出int(0)

var_dump((int)$c); //输出int(0)

//字符串开头是数字

$a='1a';

$b='2b';

$c="100cc";

var_dump((int)$a); //输出int(1)

var_dump((int)$b); //输出int(2)

var_dump((int)$c); //输出int(100)

//字符串结尾是数字

$a='a1';

$b='b2';

$c="cc100";

var_dump((int)$a); //输出 int(0)

var_dump((int)$b); //输出 int(0)

var_dump((int)$c); //输出 int(0)

//字符串中间是数字

$a='a1a';

$b='b2b';

$c="cc100cc";

var_dump((int)$a); //输出 int(0)

var_dump((int)$b); //输出 int(0)

var_dump((int)$c); //输出 int(0)

//字符串开头是浮点数

$a='1.1a';

$b='2.2b';

$c="100.1cc";

var_dump((float)$a); //输出 double(1.1)

var_dump((float)$b); //输出 double(2.2)

var_dump((float)$c); //输出 double(100.1)

//字符串开头是小数点

$a='.1a';

$b='.2b';

$c=".1cc";

var_dump((float)$a); //输出 double(0.1)

var_dump((float)$b); //输出 double(0.2)

var_dump((float)$c); //输出 double(0.1)

//字符串开头是科学计数法的浮点数

$a='1e1a';

$b='2E2b';

$c="3e3cc";

var_dump((float)$a); //输出 double(10)

var_dump((float)$b); //输出 double(200)

var_dump((float)$c); //输出 double(3000)

//字符串以0开头,以十进制解析

$a='0a';

$b='01b';

$c="02cc";

var_dump((float)$a); //输出 double(0)

var_dump((float)$b); //输出 double(1)

var_dump((float)$c); //输出 double(2)

运算:

​​​​​​​$foo = 1 + "10.5";                // $foo is float (11.5)

$foo = 1 + "-1.3e3";              // $foo is float (-1299)

$foo = 1 + "bob-1.3e3";           // $foo is integer (1)

$foo = 1 + "bob3";                // $foo is integer (1)

$foo = 1 + "10 Small Pigs";       // $foo is integer (11)

$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)

$foo = "10.0 pigs " + 1;          // $foo is float (11)

$foo = "10.0 pigs " + 1.0;        // $foo is float (11)

判别流程:1,看开头是否有合法的数值,有则使用,无则为0。 2,合法的数值不含. e E在整形范围为整数,其他为浮点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值