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

3.3 PHP的数据类型

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

说明

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

3.3.1  标量数据类型

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

表3.1 标量数据类型

1.布尔型(boolean)

布尔型变量通常保存一个true值或false值,其中true和false是PHP的内部关键字。布尔型变量通常应用在条件判断语句或循环控制语句的表达式中。

【例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】应用单引号和双引号输出同一个变量。(实例位置:资源包\TM\sl\3\2)

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

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

单引号和双引号的输出结果完全不同,双引号输出的是变量的值,而单引号输出的是字符串“$i”。运行结果如图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所示。

注意

如果给定的数值超出了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.3 不同进制的输出结果

图3.4 输出浮点类型

注意

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

3.3.2  复合数据类型

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

表3.3 复合数据类型

1.数组(array)

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

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

$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章中会详细介绍数组的相关知识。

2.对象(object)

世间万物皆为对象,对象包含方法和属性。在PHP中,用户可以自由使用面向过程和面向对象这两种开发方法。第14章中将详细介绍面向对象相关的知识。

3.3.3  特殊数据类型

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

表3.4 特殊数据类型

1.资源(resource)

关于资源的类型,可以参考PHP手册后面的附录,里面有详细的介绍和说明。使用资源时,系统会自动启用垃圾回收机制,释放不再使用的资源,避免内存消耗殆尽。因此,资源很少需要手工释放。

2.空值(null)

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

【例3.6】被赋值为null的几种情况。(实例位置:资源包\TM\sl\3\6)

字符串string1被赋值为null。string2未被声明和赋值,所以也输出null。string3虽然被赋了初值,但被unset()函数处理后,也变为null型。unset()函数的作用是从内存中删除变量。

<?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 检测数据类型的函数

由于检测数据类型的函数的功能和用法都是相同的,下面使用is_numeric()函数来检测变量中的数据是否为数字,从而了解并掌握is系列函数的用法。

【例3.8】检测变量是否是电话号码(即全由数字组成)。(实例位置:资源包\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!