PHP弱类型安全问题笔记

时间:2022-03-21 15:31:49

一、类型转换问题

   intval();

var_dump(intval('1asdfasd'));  //1

var_dump(intval('awqw12'));  //0

var_dump(intval(array()));    //0

var_dump(intval(array('foo','val'))); //1

var_dump(intval(0x1A)); //26  十六进制转换

var_dump(intval('asdfqwer')); //0

intval 如果转换值为字符串时,不会返回错误,而是返回 0,如果转换值为数组时,有两种情况,转换值为空数组时,则会返回0,否则就会返回 1

注意:php用32位内存来保存一个整数,32位可以表示4294967296个数字,有符号的话就是-2147483647到2147483648;

二、内置函数松散性问题

     switch();

$i='3adcd';

switch($i){

case 1:

echo 'i is 1';

break;

case 2:

echo 'i is 2';

break;

case 3:

echo 'i is 3';

break;

default:

echo 'i is default';

break;

}

以上结果,会进入switch case 3 里面,为什么会这样,如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类,所以上述执行的时候,首先会把$i进行了类型转换,转换结果为3 ,所以。。。

in_array();

$arr = [0,1,2,3,'test'];

var_dump(in_array('abd',$arr));    // true

var_dump(in_array('1bc',$arr));    // true

为什么上面执行结果会是这样的,后面通过查询手册,官方给出的说法是, in_array 默认是走松散比较方式,只比值是否相等,而不比较值的类型是否一样,所以才有上面这种结果,不过可以设置in_array 函数第三个参数,设置为True就是严谨的比较方式。

以上都是我们平常开发需要注意的地方。