请稍等...页面即将加载完成

易忽视的php错误【保持更新】

时间: 2011-06-15 / 分类: 我爱PHP / 浏览次数: 937 views / 2个评论 发表评论

      最近发现一些易忽视的php错误,这些错误在大多数情况下是不会有什么问题的,但如果咬写开源代码,这种问题绝不可犯,否则一定或多或少存在安全漏洞,给不法分子钻了空子。

      1、switch语句条件中的0,不理解原因,感叹一下这神奇的0:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch(0){
    case 'xxx':
        echo 'haha1';
        break;
    default:
        echo 'hehe';
}//haha1
 
switch(0){
    case true: //true换成数字一样
        echo 'haha2';
        break;
    default:
        echo 'hehe';
}//hehe

      先不说解决方法,在继续来一个例子:

      2、in_array中的0

1
2
3
var_dump(in_array(0, array('x', 'a'))); //true
var_dump(in_array(0, array(1, true, false))); //true
var_dump(in_array(0, array(1, true, 2))); //false

      这个错误和上面的错误貌似有异曲同工之妙,看来可以大胆推测下面这个等式的成立:

1
2
3
4
var_dump(0 == 'xxx'); //true
var_dump(0 == false); //true
var_dump(strval(0) == 'xxx'); //false
var_dump(true == 'xxx'); //true

      所以避免这种问题的办法是strval($arg)使之与比较对象具有相同类型。

      3、empty中的’0′字符串

1
2
3
4
$a = '0'; //同数字0、false
if(empty($a)){
    echo 'xxx';
} //xxx

      这个问题在官方文档中有说明,不小心容易忽视。

      4、非全等判断

1
var_dump('0123' == '123'); //true

      这个东西就更不用说了,公司用户名曾犯的错,记忆深刻

      5、一些‘类’函数结构

1
2
3
4
$somevar = 12;
$func="unset"; 
$func($somevar); //undefined function unset()
//function_exist('unset'); //false

      像unset()、echo()这种都属于语言结构的一部分,并非函数。

      6、unset全局变量的解决办法:

1
2
3
4
5
6
7
8
$id = 1;
function test()
{
   global $id;
   unset($id);
}
test();
echo($id);  //1

      这种方式在PHP3中运行正常(虽然我没试),在php4以上需要使用:

1
unset($GLOBALS["id"]);

      好了,没了,先就写这么多,欢迎大家来抨击。

更多
订阅

2个评论

  1. 小子
    2011/09/26 于 06:31:09

    和数字比较的时候php会自动转换字符串的类型

    intval(‘xxx’); //0

  2. 27#701
    2011/06/18 于 04:16:13

    党员,过来踩踩

发表评论

您的昵称 *

您的邮箱 *

您的网站


four * = 32