从PHP 4开始,PHP中的变量不需要事先声明,赋值即可声明。在使用这些数据类型前,读者需要了解它们的含义和特性。下面介绍整型、浮点型、布尔型、字符串型、数组型、对象型以及NULL和Resource两个比较特殊的类型。
3.5.1 什么是数据类型
不同的数据类型其实就是所存储数据的不同种类。PHP的不同数据类型主要包括:
·整型(integer):用来存储整数。
·浮点型(float):用来存储实数。
·字符串型(string):用来存储字符串。
·布尔型(boolean):用来存储真(true)或假(false)。
·数组型(array):用来存储一组数据。
·对象型(object):用来存储一个类的实例。
作为弱类型语言,PHP也被称为动态类型语言。在强类型语言(例如C语言)中,一个变量只能存储一种类型的数据,并且这个变量在使用前必须声明变量类型。而在PHP中,给变量赋什么类型的值,这个变量就是什么类型,例如以下几个变量:
$hello = "hello world";
由于hello world是字符串,因此变量$hello的数据类型就是字符串类型。
$hello = 100;
同样,由于100为整型,因此$hello也就是整型。
$wholeprice = 100.0;
由于100.0为浮点型,因此$wholeprice就是浮点型。
由此可见,对于变量而言,如果没有定义变量的类型,则它的类型由所赋值的类型决定。
3.5.2 整型
整型是数据类型中最为基本的类型。在现有的32位运算器下,整型的取值是从-2147483648到+2147483647。整型可以表示为二进制、八进制、十进制和十六进制。
要使用二进制表达,数字前必须加上0b;要使用八进制表达,数字前必须加上0;要使用十六进制表达,数字前必须加上0x。
例如:
<?php
$a = 1234; // 十进制数
$a = -123; // 负数
$a = 0123; // 八进制数 (等于十进制83)
$a = 0x1A; // 十六进制数 (等于十进制26)
$a = 0b11111111; // 二进制数字 (等于十进制255)
?>
在PHP 8中,整型值的字长可以用常量PHP_INT_SIZE来表示,最大值可以用常量PHP_INT_MAX来表示,最小值可以用常量PHP_INT_MIN表示。整型数的字长和平台有关,32位平台下的最大值是2147483647,64位平台下的最大值通常大约是9223372036854775807。
3.5.3 浮点型
浮点型用于表示实数。在大多数运行平台下,这个数据类型的大小为8个字节。它的近似取值范围是2.2E-308~1.8E+308(科学记数法)。
例如:
-1.432
1E+07
0.0
3.5.4 布尔型
布尔型只有两个值,就是true和false。布尔型是十分有用的数据类型,程序可以通过它实现逻辑判断的功能。
其他的数据类型基本都有布尔属性:
·整型:为0时,其布尔属性为false;为非零值时,其布尔属性为true。
·浮点型:为0.0时,其布尔属性为false;为非零值时,其布尔属性为true。
·字符串型:为空字符串“”或者零字符串“0”时,其布尔属性为false;包含除此以外的字符串时,其布尔属性为true。
·数组型:若不含任何元素,其布尔属性为false;只要包含元素,则其布尔属性为true。
·对象型和资源型:其布尔属性永远为true。
·NULL型:其布尔属性永远为false。
3.5.5 字符串型
字符串型的数据是表示在引号之间的数据。引号分为双引号“””和单引号“’”。这两种引号可以表示字符串,但是这两种表示方法也有一定的区别。
双引号几乎可以包含所有的字符,但是在其中的变量显示变量的值,而不是变量的变量名,有些特殊字符加上“\”符号就可以了;单引号内的字符是被直接表示出来的。
下面通过一个案例来讲解整型、浮点型、布尔型和字符串型数据的使用方法和技巧。
【例3.10】
<?php
$int1= 2021; // 十进制整数
$int2= 01223; //八进制整数
$int3=0x1223; //十六进制整数
echo "输出整数类型的值:";
echo $int1;
echo "\t"; //输出一个制表符
echo $int2; //输出659
echo "\t";
echo $int3; //输出4643
echo "<br/>";
$float1=54.66;
echo $float1; //输出54.66
echo "<br/>";
echo "输出布尔型变量:";
echo (Boolean)( $int1); //将int1 整型转化为布尔型变量
echo "<br/>";
$string1="字符串类型的变量";
echo $string1;
?>
本程序运行结果如图3-10所示。
3.5.6 数组型
数组是PHP变量的集合,它按照“键”与“值”的对应关系组织数据。数组的键值既可以是整数,也可以是字符串。另外,数组在不特意表明键值的默认情况下,数组元素的键值为从零开始的整数。
在PHP中,使用list()函数或array()函数来创建数组,也可以直接进行赋值。
下面使用array()函数创建数组。
【例3.11】
本程序运行结果如图3-11所示。
【案例分析】
(1)程序中用“=>”为数组赋值,数组的下标只是存储的标识,没有任何意义,数组元素的排列以加入的先后顺序为准。
(2)本程序采用foreach()方法输出整个数组。
上面实例的语句可以简化如下。
【例3.12】
<?php
$arr=array(15,1E+05,"开始学习PHP基本语法了"); // 定义数组并赋值
for ($i=0;$i<3;$i++)
{
echo $arr[$i]."<br/>";
}
?>
本程序运行结果如图3-12所示。从结果可以看出,这两种写法的运行结果相同。
另外,读者还可以对数组的元素一个一个地赋值,下面举例说明。
【例3.13】
<?php
$arr[0]=2021; // 对数组元素分别赋值
$arr[2]= 18.88;
$arr[1]= "北风卷地白草折,胡天八月即飞雪。";
foreach ($arr as $value) { // 使用foreach()方法输出数组内容
echo $value."<br/>";
}
?>
本程序运行结果如图3-13所示。
3.5.7 对象型
对象就是类的实例。当一个类被实例化以后,这个被生成的对象被传递给一个变量,这个变量就是对象型变量。对象型变量也属于资源型变量。
3.5.8 NULL型
NULL类型是仅拥有NULL这个值的类型。这个类型用来标记一个变量为空。一个空字符串与NULL是不同的。在数据库存储时会把空字符串和NULL区分开处理。NULL型在布尔判断时永远为false。很多情况下,在声明一个变量的时候可以直接先赋值为NULL型,如$value=NULL。
3.5.9 资源类型
资源(resource)类型是十分特殊的数据类型。它表示PHP的扩展资源,可以是一个打开的文件,也可以是一个数据库连接,甚至可以是其他的数据类型。但是在编程过程中,资源类型却是几乎永远接触不到的。
3.5.10 数据类型之间的相互转换
数据从一个类型转换到另一个类型,就是数据类型转换。在PHP语言中,有两种常见的转换方式:自动数据类型转换和强制数据类型转换。
1.自动数据类型转换
这种转换方式最为常用,直接输入数据的转换类型即可。
【例3.14】
<?php
$a = "2"; //$a是字符串
echo $a;
echo "<br/>";
$a*=2; //$a现在是一个整数
echo $a;
echo "<br/>";
$a*=1.4; //$a现在是一个浮点数
echo $a;
?>
程序运行结果如图3-14所示。
2.强制数据类型转换
在PHP语言中,可以使用settype函数强制转换数据类型,基本语法如下:
Bool settype(var,string type)
type的可能值不能包含资源类型数据。如果转型成功,就返回1,否则返回0。
【例3.15】
<?php
$flo1=100.86; // 定义浮点型数据
echo settype($flo1,"int");// 强制转换数据为整数并输出
echo "<br/>";
echo $flo1;
?>
本程序运行结果如图3-15所示。这里返回结果为1,说明浮点数100.86转型为整数100已经成功了。
3.6 整型处理机制
PHP 7以前的版本里,如果向八进制数传递了一个非法数字,例如8或9,则后面其余数字会被忽略。在PHP 7及以后的版本中,将会出现编译错误。
例如下面的代码将会报错:
$a = 0792; // 9是无效的八进制数字
在PHP 8中,如果位移负的位置,将会产生异常,例如:
var_dump(1 >> -1);
// ArithmeticError: Bit shift by negative number
在PHP 8中,左位移如果超出位数,就会返回为0,例如:
var_dump(1 << 64); // int(0)
而在PHP 7之前的版本中,运行结果和CPU的架构有关系,比如x86会返回1。
在PHP 7及以后的版本中,右位移如果超出位数,就会返回0或者-1,例如:
var_dump(1 >> 64); // int(0)
var_dump(-1 >> 64); // int(-1)