每一种编程语言都有基本数据类型的处理方法,PHP也是这样,下面我们就先来看一看PHP有哪些常用的基本数据类型。
基本数据类型
整数
PHP中的整数定义为有符号整数,但取值范围与平台有关,如在32位环境中,它就是一个32位的有符号整数;而在64环境中,就是64位有符号整数。
本书大部分示例中都使用了64位的操作系统和PHP环境,所以,我们可以认为PHP环境下的整数为64位有符号整数,其取值范围为-264到264-1。
除了十进制整数,PHP中同样可以使用十六进制(0x前缀)和八进制(0前缀),如:
- 0x1F,表示十六进制数1F。
- 0123,表示八进制数123。
浮点数
PHP中的浮点数取值范围同样与平台有关,一般为64位浮点数。
NULL值
NULL值表示没有数据,这与数据库中的NULL值的含义是相同的。
布尔类型
布尔类型数据的值只能是true或false。当其它类型的值转换为布尔类型数据时,会遵循以下基本规则:
- 整数转换为布尔型,只有0转换为false值,其它数值都会转换为true值。
- 浮点数转换为布尔型,只有0.0转换为false值,其它数值都转换为true值。
- NULL值转换为布尔型,始终为false值。
由于布尔类型只支持true和false值,所以,它们的运算也相对比较简单,如:
- &&或and运算符,进行左右两个操作数的“与”运算,只有两个操作数都是true值时,运算结果才为true值,否则运算结果为false。如true && false结果为false,而true && true结果为true。
- ||或or运算符,进行左右两个操作数的“或”运算,当两个操作数中的一个为true时,运算结果就是true;只有两个操作数都是false时,运算结果才是false值。
- !运算符,取反运算。!true为false值,!false为true值。
- xor,进行左右两个操作数的异或运算。当两个操作数不同时,运算结果为true,相同时运算结果为false。如true xor true结果为false,而true xor false结果为true。
需要注意的是“与”运算和“或”运算,它们都具有“短路”功能。在“与”运算中,如果左操作数为false,则不会计算右操作数,而是直接返回false值;而在“或”运算中,如果左操作数为true,则不会计算右操作数,而是直接返回true。实际应用中,我们可以将主要或重要的判断条件放在左操作数,这样有助于提高代码的运行效率。
此外,请注意NULL值与false值,当你使用“false == NULL;”语句,结果会是true;但是,我们知道false值和NULL值的含义是不同的,所以,当你使用“false === NULL”语句时会返回false,即它们不是全等的。
变量
PHP与C、C++、C#、Java等语言最大的不同在于,使用PHP变量时不需要事先声明,比如,在C语言中声明变量i并赋值为1时,会使用如下代码:
int i = 1;
而在PHP中,只需要使用如下代码:
$i = 1;
在PHP中,变量都使用$符号开始,后面的命名规则就与其它编程语言差不多了,即使用字母或下划线开头,然后由字母、下划线或数字组成。 我们可看到,在使用变量时,并没有指定变量的类型,那么,在运行当中,它是怎么工作的呢?答案是,PHP变量会根据赋予的值来判断类型,如1被认为是整数、1.0被认为是浮点数等。
此外,在调试过程中有一个非常实用的var_dump()函数,它的作用就是显示变量的类型与值信息,此函数可以有一个或多个参数,如:
$intVal = 1;
$floatVal = 1.1;
$boolVal = true;
var_dump($intVal, $floatVal, $boolVal);
其显示信息为“int(1) float(1.1) bool(true)”。
在使用变量前,我们可使用isset()语句结构判断变量是否存在或者是否包含有效数据(非NULL值),如:
$i = 1;
$j = NULL;
var_dump(isset($i)); // bool(true)
var_dump(isset($j)); // bool(false)
var_dump(isset($k)); // bool(false)
与isset()语句结构相关的语句还有:
- unset()语句结构,取消变量的定义并自动释放其所占内存(如果可以的话)。
- empty()语句结构,当变量没有定义或为null值时,返回true值;当参数中包含有效数据时返回false,此函数与isset()函数的功能正好相反。
常量
在PHP中定义常量时,可以使用define()函数或const语句,其中,define()函数是在代码运行时创建全局常量,这些常量可以在其所定义文件或引用此文件的页面中使用,其格式如下:
define(<常量名>,<常量值>,<是否忽略大小写>);
其中:
- <常量名>,指定常量名称,习惯用法是使用C常量风格,即所有字母大写,单词间使用下划线分隔。本书中将使用这一风格。
- <常量值>,指定常量的值。
- <是否忽略大小写>,这是一个可选参数,如果不指定此参数,则默认为true,即在常量使用时忽略字母的大小写。
下面就是一个常量应用的代码:
define("MAX_NUMBER", 100);
echo MAX_NUMBER; // 显示100
如果我们需要判断一个常量是否已定义,可以使用defined()函数,如:
define("MAX_NUMBER", 100);
var_dump(defined("MAX_NUMBER")); // 显示 bool(true);
const语句一般在类(class)中定义常量,用于模拟枚举类型,我们会在介绍面向对象编程时介绍。
类型判断
PHP中定义了一系列的数据类型判断函数,它们的返回结果都是布尔类型(true或false),常用的包括:
- is_integer()、is_int()和is_long()函数,判断参数是不是一个整数。
- is_double()、is_float()和is_real()函数,判断参数是不是一个浮点数。
- is_null()函数,判断参数是否为NULL值。
- is_bool()函数,判断参数是否为布尔类型。
- is_string()函数,判断参数是否为字符串类型。
- is_array()函数,判断参数是否为数组。稍后介绍数组相关内容。
- is_scalar()函数,当参数为整数、浮点数、字符串或布尔类型值时返回true,否则返回false。
- is_numeric()函数,参数可以转换为数值时返回true,否则返回false。
此外,我们还可以使用gettype()函数直接获取参数的数据类型名称,如下面的代码。
$val = true;
echo gettype($val); // 显示 boolean
类型转换
数据类型转换前,我们可以使用前面介绍的类型判断函数做一些测试工作,当我们需要将一个值转换为另外一个类型时,有几种基本的方法可以使用:
第一种方法是使用settype()函数,其中,参数一为原值,参数二为目标类型,使用字符串形式的类型名称。如下面的代码:
$val = '123';
echo gettype($val);
echo '<br>';
settype($val,'integer');
echo gettype($val);
代码显示结果如下图。
我们可以看到,使用settype()函数实际上是修改变量自身的类型,如果我们不修改变量自身类型,而是需要一个类型转换后的数据,可以使用与C风格相似的转换方法,即在需要转换的数据前使用小括号包含目标类型名称,如下面的代码。
$val = '123';
echo gettype($val);
echo '<br>';
$num = (int)$val;
echo gettype($num);
本代码显示结果与上图是一样的。
在PHP中,还有第三种方法可以用于数据类型转换,即使用相应类型的转换函数,如:
- intval()函数,将参数一转换为整数,参数二为可选,用于指定原数据的进制,默认为十进制,函数将返回转换后的整数数据,如果转换失败则返回0。
- floatval()函数,将参数转换为浮点数,函数将返回转换后的浮点型数据,如果转换失败则返回0。
- strval()函数,将参数转换为字符串形式。
- boolval()函数,将参数转换为布尔类型。
下面的代码演示了这几个函数的使用。
$str = 'F';
$num = intval($str,16);
var_dump($num); // int(15),十六进制数F转换为十进制数15
var_dump(floatval($str)); // float(0)
var_dump(strval($num)); // string(2)"15"
var_dump(boolval($str)); // bool(true)
此外,关于浮点数,我们可以使用round()函数确定它的小数位,对于多出的小数位,会进行四舍五入操作,如果指定的小位数多于原数小数位,则会显示原数值。如下面的代码:
echo round(2.125, 1); // 显示2.1
echo '<br>';
echo round(2.125, 2); // 显示2.13
echo '<br>';
echo round(2.125, 4); // 显示2.125
另外一个常用的格式化数值的函数是number_format(),它会返回一个格式化后的字符串,其定义如下:
string number_format(<原值>, <小数位>, <整数与小数分隔符>, <千位分隔符>)
下面的代码演示了常用的几种方法:
$val = 123456.92789;
echo number_format($val); // 显示123,457
echo '<br>';
echo number_format($val, 2); // 显示123,456.93
echo '<br>';
echo number_format($val, 4, '.', ','); // 显示123,456.9279
echo '<br>';
echo number_format($val, 3, '.', ''); // 显示123456.928
代码中分别使用了四个number_format()函数:
- number_format($val),使用一个参数,指定需要转换的数值,默认情况下会对小数部分进行四舍五入,使用逗号作为千位分隔符。
- number_format($val, 2),使用两个参数,其中参数二为需要保留的小数位,其余部分进行四舍五入,使用逗号作为千位分隔符。
- number_format($val, 4, ‘.’, ‘,’),使用四个参数,参数三设置整数部分与小数的分隔符,参数四设置逗号作为千位分隔符。
- number_format($val, 3, ‘.’, ”),使用四个参数,参数三设置整数部分与小数的分隔符,参数四设置千位分隔符为空,即不使用千位分隔符。
关于数据类型的转换,我们不得不提的是PHP中强大的自动转换功能,如使用print或echo语句显示内容时,无论你指定显示的是什么类型的内容,这两个语句都能自动将这些内容转换成文本内容并显示。不过,这并不包括没有定义__toString()方法的对象。
在实际应用中,我们应该多思考,并进行相应的测试工作,以掌握PHP在数据类型转换中的灵活性,同时,也要注意转换过程中可能出现的问题。