zoukankan      html  css  js  c++  java
  • PHP 不同类型之间的松散和严格比较

    原始数据类型

    在比较之前先简单介绍一下PHP的9种原始数据类型,包括

    四种标量类型:

    • boolean(布尔型)
    • integer(整型)
    • float(浮点型,也称作 double)
    • string(字符串)

    三种复合类型:

    • array(数组)
    • object(对象)
    • callable(可调用)

    最后是两种特殊类型:

    • resource(资源)
    • NULL(无类型)

     此外还有一些伪类型:

    • mixed(混合类型)
    • number(数字类型)
    • callback(回调类型,又称为 callable)
    • array|object(数组 | 对象类型)
    • void (无类型)

    以及伪变量 $...

    不同类型之间比较进行的转换

    1、数字字符串比较

    如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。例如:

    <?php
    var_dump(0 == "a"); // 0 == 0 -> true
    var_dump("1" == "01"); // 1 == 1 -> true
    var_dump("10" == "1e1"); // 10 == 10 -> true
    var_dump(100 == "1e2"); // 100 == 100 -> true
    
    switch ("a") {
    case 0:
        echo "0";
        break;
    case "a": // 不会匹配到,因为"a" 已经与0匹配
        echo "a";
        break;
    }
    ?>

    之前在网上看别人说PHP有个大bug,就是0与任何字符串进行 == 比较时都为 true 。其实这并不是一个bug,只是因为PHP在进行数字和字符串比较时会将字符串转换为0。

    2、多种类型比较

    对于多种类型,比较运算符根据下表比较(按顺序)。

    运算数1 类型 运算数2 类型 结果
    null 或 string string 将 NULL 转换为 "",进行数字或词汇比较
    bool 或 null 任何其它类型 转换为 bool,FALSE < TRUE
    object object 内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP 4 中),PHP 5 有其自己的说明
    string,resource 或 number string,resource 或 number 将字符串和资源转换成数字,按普通数学比较
    array array 具有较少成员的数组较小,如果运算数 1 中的键不存在于运算数 2 中则数组无法比较,否则挨个值比较(见下例)
    object 任何其它类型 object 总是更大
    array 任何其它类型 array 总是更大

     

    比较结果

    1、使用 PHP函数 对变量 $x 进行比较

    表达式 gettype() empty() is_null() isset() boolean : if($x)
    $x = ""; string TRUE FALSE TRUE FALSE
    $x = null; NULL TRUE TRUE FALSE FALSE
    var $x; NULL TRUE TRUE FALSE FALSE
    $x is undefined NULL TRUE TRUE FALSE FALSE
    $x = array(); array TRUE FALSE TRUE FALSE
    $x = false; boolean TRUE FALSE TRUE FALSE
    $x = true; boolean FALSE FALSE TRUE TRUE
    $x = 1; integer FALSE FALSE TRUE TRUE
    $x = 42; integer FALSE FALSE TRUE TRUE
    $x = 0; integer TRUE FALSE TRUE FALSE
    $x = -1; integer FALSE FALSE TRUE TRUE
    $x = "1"; string FALSE FALSE TRUE TRUE
    $x = "0"; string TRUE FALSE TRUE FALSE
    $x = "-1"; string FALSE FALSE TRUE TRUE
    $x = "php"; string FALSE FALSE TRUE TRUE
    $x = "true"; string FALSE FALSE TRUE TRUE
    $x = "false"; string FALSE FALSE TRUE TRUE

     

    2、松散比较 == (不比较类型)

      TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php"  ""
    TRUE TRUE FALSE TRUE FALSE TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE
    FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE FALSE TRUE
    1 TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    0 FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE TRUE TRUE
    -1 TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
    "1" TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    "0" FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
    "-1" TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
    NULL FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE TRUE FALSE TRUE
    array() FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE
    "php" TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
    "" FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE

     

    3、严格比较 === (比较类型)

      TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
    TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    1 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    0 FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    -1 FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    "1" FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    "0" FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
    "-1" FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
    NULL FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
    array() FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
    "php" FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
    "" FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
  • 相关阅读:
    memcached-session-manager 教程实现session共享
    无锁编程实战演练
    关于找不到类org/apache/commons/lang/xwork/StringUtils的问题
    10 ref 和 out 之间的差别
    MongoDB---性能优化---(1)
    Ubuntu14.04+eclipse下cocos2d-x3.0正式版环境的搭建
    谈谈“一站式服务”
    串的堆分配存储表示
    cocos2d-x教程3:用php或DOS批处理命令来转换文件和解压缩zip
    为HttpStatusCodeResult加入customErrors
  • 原文地址:https://www.cnblogs.com/weiyalin/p/10388167.html
Copyright © 2011-2022 走看看