PHP从入门到精通(第4版)(软件开发视频大讲堂)
上QQ阅读APP看书,第一时间看更新

3.3 PHP的数据类型

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

说明

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

3.3.1 标量数据类型

视频讲解:光盘\TM\lx\3\03 标量数据类型.mp4

标量数据类型是数据结构中最基本的单元,只能存储一个数据。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)

浮点数据类型可以用来存储数字,也可以保存小数。它提供的精度比整数大得多。在32位的操作系统中,有效的范围是1.7E-308~1.7E+308。在PHP 4.0以前的版本中,浮点型的标识为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 复合数据类型

视频讲解:光盘\TM\lx\3\04 复合数据类型.mp4

复合数据类型包括两种,即数组和对象,如表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 特殊数据类型

视频讲解:光盘\TM\lx\3\05 特殊数据类型.mp4

特殊数据类型包括资源和空值两种,如表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 数据类型转换

视频讲解:光盘\TM\lx\3\06 数据类型转换.mp4

虽然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 检测数据类型

视频讲解:光盘\TM\lx\3\07 检测数据类型.mp4

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!