PHP弱类型问题
关于php的弱类型特性
PHP弱类型
变量类型(8种)
- 标准类型:boolen(布尔),integer(整型),float,string
- 复杂类型:array,object
- 特殊类型:resource,null
类型转换问题
<?php
$a='abc'
if($a==0){
echo'is 0';
}else{
echo 'is not 0';
}
?>
这里输出的是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;
}
?>