PHP弱类型问题

PHP弱类型

变量类型(8种)

  • 标准类型:boolen(布尔),integer(整型),float,string

  • 复杂类型:array,object

  • 特殊类型:resource,null

    类型转换问题

    这里输出的是is 0,而不是is not 0。因为在最开始的时候定义a=='abc'为字符串类型,但是在下面比较的时候是和数字进行比较,这时候执行的相当于if(intval($a)==0),

    获取变量的整数值,允许以使用特定的进制返回。默认10进制
    注:如果参数为整数,则不做任何处理。
    <语法>
    intval(var,base)
    其中var是必须的,base不是

echo intval("0x1a", 0), "\n"; // 使用16进制。 结果 "26"
echo intval("057", 0), "\n"; // 使用8进制。 结果 "47"
 echo intval("57"),"\n"; // 使用10进制。结果57
 echo intval("42", 0), "\n"; //  结果 "42"

松散比较

$var1==$var2

1.$var1=flase;$var2=ture;//ture
2.$var1=;$var2=null;//ture

还有一些其他的也是相等的:

0==’0’
0==’abc’
1==‘1abc‘

hash比较

在进行比较运算的时候,如果遇到0e\d+这种字符串,其被解析为科学计数法,所有的都为0.0e文章

1.’’0e123456789’’==’’0e54684815318’’//true

十六进制转换

php会将十六进制解析为十进制然后再进行比较

‘’0x1e240’’==’’132456’’//true
这里0x1e240的十进制就是132456,所以这里int型和string型都是相等的。

类型转换

  • 转换为整型:(int),(integer)
  • 浮点型:(float),(double),(real)
  • 字符串:(string)
  • 布尔型:(bool),(boolean)
  • 数组:(array)
  • 对象:(object)

    转换方式

1.具体函数:intval(),floatval(),strval()….
2.通用类型转换函数:settype(mixed var,string type)
查阅资料得知,intval()在转换类型的时候,会从字符串开始进行转换直到遇到第一个非数字的字符。但是即使出现了无法转换的字符串,也不会报错,而是返回0.

var_dump(intval(abc))//0
var_dump(intval(1abc))//1、

内置函数的松散型

in_array()

检查数组中是否存在某个值

bool in_array(mixed $needle,array $haystack[,bool $strict =FALSE])

大海捞针,在大海(haystack)中搜索针(needle),如果没有设置strict则使用宽松比较。

参数

  • needle:待搜索的值,如果是字符串,则比较是区分大小写的。
  • haystack:待搜索的数组。
  • strickt:如果第三个参数strict的值为true则In_arrray()还会检查needle的类型是否和haystack相同。
<?php
$os=array("Mac","MT","Irix","Linux");
if(in_array("Irix",$os)){
echo"Got Irix;
}
if (in_array("Mac",$os)){
echo "Got Mac";
}
?>

注意:in_array()函数是区分大小写的。

md5

md5()需要的是一个string型的参数,但是当传递一个array给它时,它将无法正确求得array的md5值,这样会导致任意两个array的md5值相等

str

原始字符串

raw_output

如果可选的raw_output被设置为true,那么MD5报文摘要将以16字节长度的原始二进制格式返回

返回值

以32字符十六进制数字形式返回散列值

<?php
$str=`apple`;
if(md5($str)===`1f387***************`){
echo"你真是一个睿智的人;
}
?>

strcmp

二进制安全字符串比较

strcmp("5", 5) => 0
strcmp("15", 0xf) => 0
strcmp(61529519452809720693702583126814, 61529519452809720000000000000000) => 0
strcmp(NULL, false) => 0
strcmp(NULL, "") => 0
strcmp(NULL, 0) => -1
strcmp(false, -1) => -2
strcmp("15", NULL) => 2
strcmp(NULL, "foo") => -3
strcmp("foo", NULL) => 3
strcmp("foo", false) => 3
strcmp("foo", 0) => 1
strcmp("foo", 5) => 1
strcmp("foo", array()) => NULL + PHP Warning
strcmp("foo", new stdClass) => NULL + PHP Warning
strcmp(function(){}, "") => NULL + PHP Warning

switch

switch 语句类似于具有同一个表达式的一系列 if 语句。很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。这正是 switch 语句的用途。

NOTE:注意和其它语言不同,continue 语句作用到 switch 上的作用类似于 break。如果在循环中有一个 switch 并希望 continue 到外层循环中的下一轮循环,用 continue 2

example:

<?php
if($i==0){
echo"i equeals 0";
}elseif($i==1){
echo""i equels 1";
}elseif($i==2){
echo""i equals 2";
}
switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
}
?>

   转载规则


《PHP弱类型问题》 Gsuhy 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录