PHP弱类型和强类型

PHP中的弱类型

php是一种弱类型语言,对数据的类型要求并不严格,可以让数据类型互相转换

强类型与弱类型的定义

强类型

•所谓强类型(Strongly typed),顾名思义就是强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型。J

•ava、.NET、C++等都是强类型语言,在变量使用之前必须声明变量的类型和名称;且不经强制转换不允许两种不同类型的变量互相操作。

弱类型

•对数据的类型要求并不严格,可以让数据类型互相转换。

1.== 和 ===的区别

php中其中两种比较符号:

==:先将字符串类型转化成相同,再比较

===:先判断两种字符串的类型是否相等,再比较

== 为松散比较 只比较值,不比较数据类型

特点:1.(若字符型值开头为数字,转为数字;

若开头不为数字,为 null 弱比较与 0 相等。)

''abc123''==123 => false
''abc123''==0 => true
"123abc"==123 => true

2.布尔值true和任意字符串和数值比较

布尔值true和任意字符串和数值比较都弱相等,除了0和false,因为0也认为是bool false,true是不等于false的

var_dump(true=="hyuf")                   //true
var_dump(True == 0);                     //bool(false)
var_dump(True == 'False');               //bool(true)
var_dump(True == 2);                     //bool(true)

栗子1:

而 === 为严格比较,不仅比较值也比较类型,可以看作是强语言的强制数据类型要相同

栗子2:

在PHP中,弱类型比较是指使用相等运算符(==)进行比较时,会进行弱类型转换。这意味着在进行比较之前,PHP会尝试将操作数转换为相同的类型,然后再进行比较。

var_dump("0e12345"=="0e66666");//true
var_dump(md5('240610708')==md5('NOOPCJF'));//true

里就比较对象是0e,这个被认为是科学计数法,后面加上任何数都被认为是0
在科学技术法中,数值由一个乘以10的幂次方来表示。而0e表示的是指数部分为0的科学计数法。
例如,0e5就表示0乘以10的5次方,即0乘以100000,结果仍然是0。

栗子3:

字符串和数字比较使用==时,字符串会先转换为数字类型再比较,若字符串以数字开头,则取开头数字作为转换结果,不能转换为数字的字符串(例如"aaa"是不能转换为数字的字符串,而"123"或"123aa"就是可以转换为数字的字符串)或null,则转换为0;

var_dump(12 == "12") // true
var_dump(12 == "12aa") // true
var_dump("admin" == 0) // true
var_dump(false == "" == 0 == NULL) // true

栗子4:

var_dump('a' == 0);     //bool(true)
var_dump('1a' == 1);    //bool(true)
var_dump('12a' == 1);   //bool(false)

会出现上面的结果是因为字符串在和数字比较的时候会将字符串转化为数字,比如a转换失败成False,False又和0弱类型比较是相等的,所以第一个是true。

但是如果字符串是以数字开头的,那么就会转成这个数字再做比较,所以第二个也是true,第三个则是因为转成数字后变成了12,不等于1,则为false。

php的强匹配

在PHP中,强类型比较是指使用全等运算符(===)进行比较时,进行严格的类型和值比较。只有当两个操作数的类型和值完全相等时,才会返回true,否则返回false

if(md5((string)GET[′a′])===md5((string)_GET['b'])){
var_dump($flag);
}

md5中需要的是一个string参数,但是当你传入一个array(数组)是,md5()是不会报错的,只是无法求出array的md5的值,这样就会导致任意的2个array的md5的值都会相等

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值