首页  >  文章  >  后端开发  >  php数据类型实例详解

php数据类型实例详解

小云云
小云云原创
2018-03-15 13:13:181411浏览

PHP 支持 8 种原始数据类型。四种标量类型:boolean(布尔型),integer(整型),float(浮点型,也称作double),string(字符串)两种复合类型:array(数组),object(对象),最后是两种特殊类型:resource(资源),NULL(无类型)。 

 Note: 如果想查看某个表达式的值和类型,用var_dump() 函数。如果只是想得到一个易读懂的类型的表达方式用于调试,用gettype() 函数。要查看某个类型,不要用gettype(),而用is_type 函数。

PHP是弱语言,会根据程序运行环境自动转换, 在使用 == 号时,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。(绝对比较请使用 ===)

第一个操作数类型

第二个操作数类型

类型转换

整型

浮点型

整型转换为浮点型

整型

字符串

字符串转换为数字,如果字符串转换后是浮点型,整型也会转换为浮点型

浮点型

字符串

字符串转换为浮点型

总结一下就是浮点型 > 整型 > 字符串 >布尔类型

  1. Boolean 类型

    当转换为 boolean 时,以下值被认为是FALSE:

    所有其它值都被认为是 TRUE(包括任何资源)。

  • 布尔值FALSE 本身

  • 整型值 0(零)

  • 浮点型值 0.0(零)

  • 空字符串,以及字符串 "0"

  • 不包括任何元素的数组

  • 不包括任何成员变量的对象(仅 PHP 4.0 适用)

  • 特殊类型 NULL(包括尚未赋值的变量)

  • 从空标记生成的 SimpleXML 对象

  • Integer类型

    • 整数溢出: 如果给定的一个数超出了integer 的范围,将会被解释为float。同样如果执行的运算结果超出了integer 范围,也会返回float。

    • PHP 中没有整除的运算符(这与Java不同)。1/2 产生出 float0.5。值可以舍弃小数部分强制转换为integer,或者使用round() 函数可以更好地进行四舍五入。

      <?php
      var_dump(25/7);         // float(3.5714285714286) 
      var_dump((int) (25/7)); // int(3)
      var_dump(round(25/7));  // float(4) 
      ?>
    • 当从浮点数转换成整数时,将向下取整。

    • Warning

      决不要将未知的分数强制转换为 integer,这样有时会导致不可预料的结果。

      <?php
      echo (int) ( (0.1+0.7) * 10 ); // 显示 7!
      ?>
  • Float 类型

  • <?php
    $a = 0.1;
    $b = 0.9;
    $c = 1;
    var_dump(($a+$b)==$c);//true
    var_dump(($c-$b)==$a);//falseprintf("%.20f", $a+$b); // 1.00000000000000000000
    printf("%.20f", $c-$b); // 0.09999999999999997780?>

    出现这个问题是因为浮点数计算涉及精度,当浮点数转为二进制时有可能会造成精度丢失。

  • 所以永远不要相信浮点数已精确到最后一位,也永远不要比较两个浮点数是否相等。

  • 如果确实需要更高的精度,应该使用任意精度数学函数。

  • 高精度运算的方法如下:
    bcadd 将两个高精度数字相加
    bccomp 比较两个高精度数字,返回-1,0,1
    bcp 将两个高精度数字相除
    bcmod 求高精度数字余数
    bcmul 将两个高精度数字相乘
    bcpow 求高精度数字乘方
    bcpowmod 求高精度数字乘方求模
    bcscale 配置默认小数点位数,相当于Linux bc中的”scale=”
    bcsqrt 求高精度数字平方根
    bcsub 将两个高精度数字相减
  • 如上述警告信息所言,由于内部表达方式的原因,比较两个浮点数是否相等是有问题的。不过还是有迂回的方法来比较浮点数值的。

    要测试浮点数是否相等,要使用一个仅比该数值大一丁点的最小误差值。该值也被称为机器极小值(epsilon)或最小单元取整数,是计算中所能接受的最小的差别值。

    和在小数点后五位精度内都是相等的。

    <?php
    $a = 1.23456789;
    $b = 1.23456780;
    $epsilon = 0.00001;
    if(abs($a-$b) < $epsilon) {
        echo "true";
    }
    ?>
  • String 类型

  • 如果字符串是包围在双引号(")中, PHP 将对一些特殊的字符进行解析:如 \n , \\ , \$

  • 用双引号定义的字符串最重要的特征是变量会被解析。

  • 字符串用‘.’拼接。

  • Array

  • 类型PHP的数组实际上是一个有序映射,映射是一种把values关联到keys的类型。  
    可以用 array() 语言结构来新建一个数组。它接受任意数量用逗号分隔的 键(key) => 值(value)对。

  • array(  key =>  value , ...
             )
        // 键(key)可是是一个整数 integer 或字符串 string
        // 值(value)可以是任意类型的值
        此外 key 会有如下的强制转换:
            <?php
            $arr = array(5 => 1, 12 => 2);
            $arr[] = 56;    // This is the same as $arr[13] =56; at this point of the script
            $arr["x"] = 42; // This adds a new element to the array with key "x"                
            unset($arr[5]); // This removes the element fromthe array
            unset($arr);    // This deletes the whole array
    •  包含有合法整型值的字符串会被转换为整型。例如键名"8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。

    •  浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。

    • 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。

    •  Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。

    • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。

    •  如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。

    •  PHP 数组可以同时含有 integer 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。

    • 如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。

    •  如果指定的键名已经有了值,则该值会被覆盖。

    • 要删除某键值对,对其调用 unset() 函数。unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 array_values() 函数。

  • foreach 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。

  • 数组(Array) 的赋值总是会涉及到值的拷贝。使用引用运算符通过引用来拷贝数组。   

  •  <?php
            $arr1 = array(2, 3);
            $arr2 = $arr1;
            $arr2[] = 4; // $arr2 is changed,// $arr1 is still array(2, 3)       
            $arr3 = &$arr1;
            $arr3[] = 4; // now $arr1 and $arr3 are the same
        ?>
  • NULL
        特殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL。
        在下列情况下一个变量被认为是 NULL:
            1. 被赋值为 NULL。2. 尚未被赋值。3. 被 unset()。
        转换到 NULL :使用 (unset) $var 将一个变量转换为 null 将不会删除该变量或 unset 其值。仅是返回 NULL 值而已。

  • 相关推荐:

    PHP数据类型转换的转换

    解析PHP数据类型之对象(Object)

    PHP数据类型之字符串类型

    PHP数据类型之布尔型变量详解

    php数据类型

    以上是php数据类型实例详解的详细内容。更多信息请关注PHP中文网其他相关文章!

    声明:
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn