2.1 PHP变量
变量是用来临时存储值的容器,这些值可以是数字、文本以及更复杂的排列组合等。变量又是指在程序的运行过程中随时可以发生变化的量,是程序中数据的临时存放场所。变量能够把在程序中准备使用的每一段数据都赋予一个简短、易于记忆的名字,因此非常有用。
另外,PHP是一种弱类型的程序语言。在大多数编程语言中,变量只能存储一种类型的数据,而且这个类型还必须在使用变量前声明,例如C语言中。而在PHP中,变量的类型通常不是由程序员设定的,而是根据该变量所赋值的类型决定的。
2.1.1 变量的声明
2.1.1
在PHP中用户可以声明并使用变量,但并不要求在使用变量之前一定要声明变量,当第一次给一个变量赋值时,就创建了这个变量。PHP的变量声明必须以一个“$”符号开始,后面再跟上一个变量名。变量名的命名规则如下。
● 变量名必须以字母或者下画线开头,后面可以跟上任意数量的字母、数字或者下画线,中间不能有空格。
● 变量名严格区分大小写。
● 不要使用PHP的系统关键字作为变量名,例如:echo、die、exit、case等。
● 变量名应尽量表达出清晰的含义,通常由一个或多个简单的英文单词构成。如果是由一个单词构成的,通常采用全部小写的风格;如果是由多个单词构成的,则第一个单词采用全部小写,后面的每个单词的首字母采用大写的风格。
【示例2-1】 声明变量。
2.1.2 可变变量
可变变量允许用户动态地改变一个变量的名称,其工作原理就是用一个变量的值作为另一个变量的名称。
【示例2-2】 声明可变变量。
示例2-2的执行结果如图2-1所示。
图2-1 声明可变变量
说明:在以上示例中,声明了一个可变变量$$var,$var的值是name,相当于给$name赋值为“张华”。
2.1.3 变量的类型
2.1.3
变量的类型是指保存在该变量中的数据类型。PHP提供了一个完整的数据类型集,可以将不同的数据保存在不同的数据类型中。
1.数据类型
PHP支持如下所示的数据类型。
● 整型(integer):用来表示整数。
● 浮点型(float或double):用来表示所有实数。
● 布尔型(boolean):用来表示true或者false。
● 字符串类型(string):用来表示字符串。
● 数组类型(array):用来保存数组。
● 对象类型(object):用来保存类的实例。
● 资源类型(resource):用来保存对外部资源的引用。
● NULL类型:用来表示特殊值NULL。
(1)整型(integer)
整型变量用以存储整数。整型数据除了常用的十进制数以外,还可以使用十六进制(数字前加“0x”)或八进制(数字前加“0”)数表示;整型数据也可以使用“+”或者“-”开头表示数据的正负,其中“+”可以省略。
整数数据有最大的使用范围,这与平台有关,对于32位系统而言,整型数据的范围为:-2 147 483 648~2 147 483 647。PHP不支持无符号整数,如果超出了integer这个范围,则会解释为float类型。
【示例2-3】 声明整型变量。
(2)浮点型(float或double)
浮点数(也叫双精度数或实数)是包含小数部分的数。通常用来表示整数无法表示的数据,例如,金额值、距离值、速度值等。浮点数的字长也和平台相关,64位浮点数通常最大值为1.8e308,并具有14位十进制数字的精度。
浮点数只是一种近似的数值,所以不要比较两个浮点数是否相等。
【示例2-4】 声明浮点型变量。
(3)布尔型(boolean)
布尔型是最简单的数据类型,用以表达true或false,即“真”或“假”。要给变量指定一个布尔值,使用关键字true或false,两个都不区分大小写。
当其他类型转换为布尔型时,以下值被认为是false。
● 布尔值false。
● 整型值0。
● 浮点型值0.0。
● 空白字符串和字符串“0”。
● 没有成员变量的数组。
● 特殊类型NULL(包括尚未赋值的变量)。
除了以上列出的值以外,所有其他值都被认为是true(包括任何资源)。
【示例2-5】 声明布尔型变量。
(4)字符串类型(string)
一个字符串是由一系列的字符组成的,在PHP中,一个字符串可以只是一个字符,也可以由任意多个字符组成。PHP没有给字符串的大小强制设定范围,因此不必担心字符串的长度。字符串可以使用单引号(')或者双引号(")进行定义。
① 单引号。
指定一个简单字符串的最简单的方法是使用一对单引号(' ')括起来。在单引号字符串中出现的变量不会被变量的值替代,即PHP不会解析单引号中的变量,而是将变量名原样输出。
【示例2-6】 声明字符串型变量(使用单引号)。
示例2-6的执行结果如图2-2所示。
图2-2 声明字符串型变量(使用单引号)
说明:在定义简单字符串时,使用单引号的效率会更高,因为PHP不会在解析变量上产生开销。因此,如果没有特别需求,应使用单引号定义字符串。
② 双引号。
也可以把一个字符串用一对双引号(" ")括起来。双引号字符串最重要的一点是其中的变量名会被变量值替代,即可以解析双引号中包含的变量。
包含在双引号字符串中的变量在被解析时,必须要保证该变量与字符串中的其他内容是分离的,例如通过空格进行隔开,或者用一对花括号({})括起来,以表示一个表达式。
【示例2-7】 声明字符串型变量(使用双引号)。
示例2-7的执行结果如图2-3所示。
图2-3 声明字符串型变量(使用双引号)
说明:PHP不仅仅可以解析双引号中的变量,还可以解析数组值、对象属性和方法等。
另外,如果要输出的字符串中包含单引号('),则把该字符串包含在一对双引号(" ")中;如果要输出的字符串中包含双引号("),则把该字符串包含在一对单引号(' ')中;如果要输出的字符串中既包含单引号('),又包含双引号("),则需要利用转义字符(\)进行转义,例如:(\')(\")。
【示例2-8】 声明字符串型变量(使用单、双引号)。
示例2-8的执行结果如图2-4所示。
图2-4 声明字符串型变量(使用单、双引号)
(5)数组类型(array)
PHP中的数组是一种重要的复合数据类型,可以存放多个数据,而且是可以存放任何类型的数据。数组的声明和使用将在第3章中做详细介绍。
(6)对象类型(object)
PHP中的对象与数组一样,也是一种复合数据类型,但对象是一种更高级的数据类型。一个对象类型的变量,是由一组属性值和一组方法构成,其中属性值表明对象的一种状态,而方法通常用来表明对象的功能。对象的创建和使用将在第8章中做详细介绍。
(7)资源类型(resource)
资源是一种特殊变量,保存了对外部资源的一个引用。资源是通过专门的函数来建立和使用的。使用资源类型变量保存诸如打开文件、数据库连接、图形画布区域等的特殊句柄,由程序员创建、使用和释放。任何资源在不需要时都应该被及时释放,如果忘记了释放资源,系统将自动启用垃圾回收机制,以避免内存被消耗殆尽。
(8)NULL类型
NULL类型唯一可能的值就是NULL。NULL不表示空字符串,也不表示零,而是表示一个变量的值为空。NULL不区分大小写。下列情况下的一个变量会被认为是NULL。
● 被赋值为NULL值的变量。
● 尚未被赋值的变量。
● 被unset()函数销毁的变量。
2.检测变量
可以使用以下函数来检测变量的类型。
● is_bool():判断是否为布尔型。
● is_int()、is_integer()、is_long():判断是否为整型。
● is_float()、is_double()、is_real():判断是否为浮点型。
● is_string():判断是否为字符串。
● is_array():判断是否为数组。
● is_object():判断是否为对象。
● is_resource():判断是否为资源类型。
● is_null():判断是否为NULL。
● is_numberic():判断是否是任何类型的数字和数字字符串。
另外,使用var_dump()、gettype()、isset()和empty()等函数也可以实现类似的功能,下面将做详细介绍。
(1)var_dump()函数
var_dump()函数可以用来查看变量的值和类型。其语法格式如下。
【示例2-9】 var_dump()函数。
示例2-9的执行结果如图2-5所示。
图2-5 var_dump()函数
(2)gettype()函数
gettype()函数可以用来获取变量的类型。其语法格式如下。
【示例2-10】 gettype()函数。
示例2-10的执行结果如图2-6所示。
图2-6 gettype()函数
(3)isset()和empty()函数
isset()函数可以用来检测变量是否已设置,如果检测的变量值存在,则返回true;否则返回false。其语法格式如下。
empty()函数可以用来检查变量是否为空。如果检查的变量是非空或非零的值,则返回false;如果是空字符串("")、0、"0"、null、false、array()、声明但未赋值的变量等,则返回true。其语法格式如下。
【示例2-11】 isset()和empty()函数。
示例2-11的执行结果如图2-7所示。
图2-7 isset()和empty()函数
3.销毁变量
使用unset()函数可以在内存中释放指定的变量。其语法格式如下。
【示例2-12】 unset()函数。
示例2-12的执行结果如图2-8所示。
图2-8 unset()函数
2.1.4 数据类型转换
类型转换是指将变量或值从一种数据类型转换成其他数据类型。转换的方法有两种:一种是自动转换,另一种是强制转换。在PHP中可以根据变量或值的使用环境自动将其转换为最合适的数据类型,也可以根据需要强制转换为用户指定的类型。
1.自动类型转换
只有具有相同类型的数据才能彼此操作。在PHP中,自动转换通常发生在不同数据类型的变量进行混合运算的时候。如果参与运算变量的类型不同,则需要首先转换成同一类型,然后再进行运算,其运算后的结果也是相同的类型。通常只有integer、float、boolean和string类型能进行自动类型转换。
自动类型转换虽然是由系统自动完成的,但在混合运算时,自动转换要遵循转换按数据长度增加的方向进行,以保证精度不降低。
● 有布尔值参与运算时,true将转换为整型1,false将转化为整型0后再参与运算。
● 有NULL值参与运算时,NULL值将转换为整型0再参与运算。
● 有integer型和float型的值参与运算时,先把integer型变量转换成float类型后再参与运算。
● 有字符串和数值型(integer、float)数据参与运算时,字符串先转换为数字,再参与运算。转换后的数字是从字符串开始的数值型字符串,如果在字符串开始的数值型字符串不带有小数点,则转换为integer类型的数字;如果带有小数点,则转换为float类型的数字。
【示例2-13】 自动类型转换。
2.强制类型转换
可以在要转换的变量之前加上用括号括起来的目标类型。使用括号允许的强制类型转换如下。
● (int)、(integer):转换成整型。
● (bool)、(boolean):转换成布尔型。
● (float)、(double)、(real):转换成浮点型。
● (string):转换成字符串。
● (array):转换成数组。
● (object):转换成对象。
【示例2-14】 强制类型转换。
另外,使用settype()、intval()、floatval()和strval()等函数也可以实现类型的强制转换,下面将做详细介绍。
(1)settype()函数
settype()函数可以用来将变量转换成指定的数据类型。其语法格式如下。
说明:
● 参数type为指定的数据类型。参数type有7个可选值,分别为:boolean、float、integer、array、null、object和string。如果转换成功则返回true,否则返回false。
● 该函数是直接在原字符串上进行的类型转换。
【示例2-15】 settype()函数。
(2)intval()、floatval()和strval()函数
intval()函数可以用来获取变量的整数值;floatval()函数可以用来获取变量的浮点数值;strval()函数可以用来获取变量的字符串值。其语法格式如下。
说明:
● intval()函数中的参数base为指定转化所使用的进制,默认是十进制。
● 若是浮点型转换为整型,将自动舍弃小数部分,只保留整数部分。
【示例2-16】 intval()、floatval()和strval()函数。