PHP从入门到精通(第5版)
上QQ阅读APP看书,第一时间看更新

3.3 PHP的数据类型

PHP支持8种原始类型,包括4种标量类型,即boolean(布尔型)、integer(整型)、float/double(浮点型)和string(字符串型);2种复合类型,即array(数组)和object(对象);2种特殊类型,即resource(资源)与null。

说明

PHP中变量的类型通常不是由程序员设定的,确切地说,是PHP根据该变量使用的上下文在运行时决定的。

3.3.1 标量数据类型

标量数据类型是数据结构中最基本的单元,只能存储一个数据。PHP中标量数据类型包括4种,如表3.1所示。

表3.1 标量数据类型

1.布尔型(boolean)

布尔型是PHP中较为常用的数据类型之一,它保存一个true值或者false值,其中true和false是PHP的内部关键字。设定一个布尔型的变量,只需将true或者false赋值给变量即可。

【例3.1】通常布尔型变量都是应用在条件或循环语句的表达式中。下面在if条件语句中判断变量$boo中的值是否为true,如果为true,则输出“变量$boo为真!”,否则输出“变量$boo为假!!”,实例代码如下:(实例位置:资源包\TM\sl\3\1)

    <?php
        $boo = true;                 //声明一个boolean类型变量,赋初值为true
        if($boo == true)             //判断变量$boo是否为真
             echo '变量$boo为真!';   //如果为真,则输出“变量$boo为真!”的字样
        else
             echo '变量$boo为假!!';  //如果为假,则输出“变量$boo为假!!”的字样
    ?>

结果为:变量$boo为真!

注意

在PHP中不是只有false值才为假的,在一些特殊情况下,boolean值也被认为是false。这些特殊情况有0、0.0、"0"、空白字符串("")、只声明没有赋值的数组等。

说明

美元符号$是变量的标识符,所有变量都是以$开头的,无论是声明变量还是调用变量,都应使用$。

2.字符串型(string)

字符串是连续的字符序列,由数字、字母和符号组成。字符串中的每个字符只占用一个字节。在PHP中,有3种定义字符串的方式,分别是单引号(')、双引号(")和定界符(<<<)。

单引号和双引号是经常被使用的定义方式,定义格式如下:

    <?php
        $a ='字符串';
    ?>

    <?php
        $a ="字符串";
    ?>

两者的不同之处在于,双引号中所包含的变量会自动被替换成实际数值,而单引号中包含的变量则按普通字符串输出。

【例3.2】下面的实例分别应用单引号和双引号来输出同一个变量,其输出结果完全不同,双引号输出的是变量的值,而单引号输出的是字符串“$i”。实例代码如下:(实例位置:资源包\TM\sl\3\2

    <?php
        $i = '只会看到一遍';     //声明一个字符串变量
        echo "$i";               //用双引号输出
        echo "<p>";              //输出段落标记
        echo '$i';               //用单引号输出
    ?>

运行结果如图3.1所示。

图3.1 单引号和双引号的区别

两者之间另一处不同点是对转义字符的使用。使用单引号时,要想输出单引号,只要对单引号(')进行转义即可,但使用双引号(")时,还要注意“"”“$”等字符的使用。这些特殊字符都要通过转义符“\”来显示。常用的转义字符如表3.2所示。

表3.2 转义字符

\n和\r在Windows系统中没有什么区别,都可以当作回车符。但在Linux系统中则是两种效果,在Linux中,\n表示换到下一行,却不会回到行首;而\r表示光标回到行首,但仍然在本行。如果读者使用Linux操作系统,可以尝试一下。

注意

如果对非转义字符使用了“\”,那么在输出时,“\”也会跟着一起被输出。

说明

在定义简单的字符串时,使用单引号是一个更加合适的处理方式。如果使用双引号,PHP将花费一些时间来处理字符串的转义和变量的解析。因此,在定义字符串时,如果没有特别的要求,应尽量使用单引号。

定界符(<<<)是从PHP 4开始支持的。在使用时后接一个标识符,然后是字符串,最后是同样的标识符结束字符串。定界符的格式如下:

    $string = <<< str
    要输出的字符串
    str

其中,str为指定的标识符。

【例3.3】下面使用定界符输出变量中的值,可以看到,它和双引号没什么区别,包含的变量也被替换成实际数值,实例代码如下:(实例位置:资源包\TM\sl\3\3

    <?php
        $i = '显示该行内容';                                //声明变量$i
        echo <<<std
        这和双引号没有什么区别,\$i同样可以被输出出来。<p>
        \$i的内容为:$i
    std;
    ?>

运行结果如图3.2所示。

图3.2 使用定界符定义字符串

注意

结束标识符必须单独另起一行,并且不允许有空格。在标识符前后有其他符号或字符,也会发生错误。

3.整型(integer)

整型数据类型只能包含整数。在32位的操作系统中,有效的范围是-2147483648~+2147483647。整型数可以用十进制、八进制和十六进制来表示。如果用八进制,数字前面必须加0;如果用十六进制,则需要加0x。

注意

如果在八进制中出现了非法数字(8和9),则后面的数字会被忽略掉。

【例3.4】本例分别输出八进制、十进制和十六进制的结果,实例代码如下:(实例位置:资源包\ TM\sl\3\4

    <?php
        $str1 = 1234567890;                            //声明一个十进制的整数
        $str2 = 0x1234567890;                          //声明一个十六进制的整数
        $str3 = 01234567890;                           //声明一个八进制的整数
        $str4 = 01234567;                              //声明另一个八进制的整数
        echo '数字1234567890不同进制的输出结果:<p>';
        echo '十进制的结果是:'.$str1.'<br>';          //输出十进制整数
        echo '十六进制的结果是:'.$str2.'<br>';        //输出十六进制整数
        echo '八进制的结果是:';
        if($str3 == $str4){                            //判断$str3和$str4的关系
             echo '$str3 = $str4 = '.$str3;            //如果相等,输出变量值
        }else{
             echo '$str3 != str4';                     //如果不相等,输出“$str3 != $str4”
        }
    ?>

运行结果如图3.3所示。

图3.3 不同进制的输出结果

注意

如果给定的数值超出了int型所能表示的最大范围,将会被当作float型处理,这种情况称为整数溢出。同样,如果表达式的最后运算结果超出了int型的范围,也会返回float型。

4.浮点型(float)

浮点数据类型可以用来存储数字,也可以保存小数。它提供的精度比整数大得多。在64位的操作系统中,有效的范围是1.7E-308~1.7E+308。在PHP早期版本中,浮点型的标识为double,也叫作双精度浮点数,两者没有区别。

浮点型数据默认有两种书写格式,一种是标准格式:

    3.1415
    -35.8

还有一种是科学记数法格式:

    3.58E1
    849.72E-3

【例3.5】本例中输出圆周率的近似值。用3种书写方法:圆周率函数、传统书写格式和科学记数法,最后显示在页面上的效果都一样。实例代码如下:(实例位置:资源包\TM\sl\3\5

    <?php
        echo '圆周率的3种书写方法:<p>';
        echo '第一种:pi() = '. pi() .'<p>';                          //调用pi()函数输出圆周率
        echo '第二种:3.14159265359 = '. 3.14159265359 .'<p>';        //传统书写格式的浮点数
        echo '第三种: 314159265359E-11 = '. 314159265359E-11 .'<p>'; //科学记数法格式的浮点数
    ?>

运行结果如图3.4所示。

图3.4 输出浮点类型

注意

浮点型的数值只是一个近似值,所以要尽量避免浮点型数值之间比较大小,因为最后的结果往往是不准确的。

3.3.2 复合数据类型

复合数据类型包括两种,即数组和对象,如表3.3所示。

表3.3 复合数据类型

1.数组(array)

数组是一组数据的集合,它把一系列数据组织起来,形成一个可操作的整体。数组中可以包括很多数据,如标量数据、数组、对象、资源以及PHP中支持的其他语法结构等。

数组中的每个数据称为一个元素,元素包括索引(键名)和值两个部分。元素的索引可以由数字或字符串组成,元素的值可以是多种数据类型。定义数组的语法格式如下:

    $array = array('value1',' value2 '…)

    $array[key] = 'value'

    $array = array(key1 => value1, key2 => value2…)

其中,key是数组元素的下标,value是数组下标所对应的元素。以下几种都是正确的格式:

    $arr1 = array('This','is','an','example');
    $arr2 = array(0 => 'php', 1=>'is', 'the' => 'the', 'str' => 'best ');
    $arr3[0] = 'tmpname';

声明数组后,数组中的元素个数还可以自由更改。只要给数组赋值,数组就会自动增加长度。在“第7章 PHP数组”中,会详细介绍数组的使用、取值以及数组的相关函数。

2.对象(object)

编程语言所应用到的方法有两种:面向过程和面向对象。在PHP中,用户可以自由使用这两种方法。在第13章中将对面向对象的技术进行详细的讲解。

3.3.3 特殊数据类型

特殊数据类型包括资源和空值两种,如表3.4所示。

表3.4 特殊数据类型

1.资源(resource)

资源类型是PHP 4引进的。关于资源的类型,可以参考PHP手册后面的附录,里面有详细的介绍和说明。

在使用资源时,系统会自动启用垃圾回收机制,释放不再使用的资源,避免内存消耗殆尽。因此,资源很少需要手工释放。

2.空值(null)

空值,顾名思义,表示没有为该变量设置任何值。另外,空值(null)不区分大小写,null和NULL效果是一样的。被赋予空值的情况有以下3种:还没有赋任何值、被赋值null、被unset()函数处理过的变量。

【例3.6】下面来看一个具体实例。字符串string1被赋值为null,string2根本没有声明和赋值,所以也输出null,最后的string3虽然被赋予了初值,但被unset()函数处理后,也变为null型。unset()函数的作用就是从内存中删除变量。实例代码如下:(实例位置:资源包\TM\sl\3\6

    <?php
       echo "变量(\$string1)直接赋值为null:";
       $string1 = null;                                   //变量$string1被赋空值
       $string3 = "str";                                  //变量$string3被赋值str
       if(!isset($string1))                               //判断$string1是否被设置
           echo "string1 = null";
       echo "<p>变量(\$string2)未被赋值:";
       if(!isset($string2))                               //判断$string2 是否被设置
           echo "string2 = null";
       echo "<p>被unset()函数处理过的变量(\$string3):";
       unset($string3);                                   //释放$string3
       if(!isset($string3))                               //判断$string3是否被设置
           echo "string3 = null";
    ?>

运行结果如图3.5所示。

图3.5 被赋值为null的几种情况

说明

is_null()函数用于判断变量是否为null,该函数返回一个boolean型,如果变量为null,则返回true,否则返回false。unset()函数用来销毁指定的变量。

注意

从PHP 4开始,unset()函数就不再有返回值,所以不要试图获取或输出unset()。

3.3.4 数据类型转换

虽然PHP是弱类型语言,但有时仍然需要用到类型转换。PHP中的类型转换和C语言一样,非常简单,只需在变量前加上用括号括起来的类型名称即可。允许转换的类型如表3.5所示。

表3.5 类型强制转换

注意

在进行类型转换的过程中应该注意以下内容:转换成boolean型时,null、0和未赋值的变量或数组会被转换为false,其他的为true;转换成整型时,布尔型的false转换为0,true转换为1,浮点型的小数部分被舍去,字符型如果以数字开头就截取到非数字位,否则输出0。

类型转换还可以通过settype()函数来完成,该函数可以将指定的变量转换成指定的数据类型。

    bool settype ( mixed var, string type )

其中,var为指定的变量;type为指定的类型,它有7个可选值,即boolean、float、integer、array、null、object和string。如果转换成功,则返回true,否则返回false。

当字符串转换为整型或浮点型时,如果字符串是以数字开头的,就会先把数字部分转换为整型,再舍去后面的字符串;如果数字中含有小数点,则会取到小数点前一位。

【例3.7】本例将使用上面的两种方法将指定的字符串进行类型转换,比较两种方法之间的不同。实例代码如下:(实例位置:资源包\TM\sl\3\7

    <?php
       $num = '3.1415926r*r';                         //声明一个字符串变量
       echo '使用(integer)操作符转换变量$num类型:';
       echo (integer)$num;                            //使用integer转换类型
       echo '<p>';
       echo '输出变量$num的值:'.$num;                //输出原始变量$num
       echo '<p>';
       echo '使用settype函数转换变量$num类型:';
       echo settype($num,'integer');                  //使用settype()函数转换类型
       echo '<p>';
       echo '输出变量$num的值:'.$num;                //输出原始变量$num
    ?>

运行结果如图3.6所示。

图3.6 类型转换

可以看到,使用integer操作符能直接输出转换后的变量类型,并且原变量不发生任何变化。使用settype()函数返回的是1,也就是true,而原变量被改变了。在实际应用中,可根据情况自行选择转换方式。

3.3.5 检测数据类型

PHP内置了检测数据类型的系列函数,可以对不同类型的数据进行检测,判断其是否属于某个类型,如果符合则返回true,否则返回false。检测数据类型的函数如表3.6所示。

表3.6 检测数据类型的函数

【例3.8】由于检测数据类型的函数的功能和用法都是相同的,下面使用is_numeric()函数来检测变量中的数据是否为数字,从而了解并掌握is系列函数的用法。实例代码如下:(实例位置:资源包\TM\sl\3\8

    <?php
        $boo = "043112345678";                               //声明一个全由数字组成的字符串变量
        if(is_numeric($boo))                                 //判断该变量是否由数字组成
             echo "Yes,the \$boo is a phone number: $boo!";  //如果是,输出该变量
        else
             echo "Sorry,This is an error!";                 //否则,输出错误语句
    ?>

结果为:Yes, the $boo is a phone number:043112345678!