2.4 PHP常量和变量
常量和变量是编程语言的最基本构成,代表了运算中所需要的各种值。通过变量和常量,程序才能对各种值进行访问和运算。学习变量和常量是编程的基础。常量和变量的功能就是用来存储数据的,但区别在于常量是一旦初始化就不再发生变化,可以理解为符号化的常数,本小节就介绍一下PHP中的常量和变量。
2.4.1 PHP中的常量
常量是指在程序执行过程中无法修改的值。在程序中处理不需要修改的值时,常量非常有用,例如定义圆周率PI。常量一旦定义,在程序的任何地方都不可以修改,但是可以在程序的任何地方访问。
在PHP中使用define()函数定义常量,函数第1个参数表示常量名,第2个参数表示常量的值。
例如,下面定义一个名为HOST的常量:
运行结果如图2-13所示。
图2-13 定义常量输出结果
注意
常量默认区分大小写,按照惯例,常量标识符总是大写。常量名和其他任何PHP标记遵循相同的命名规则。合法的常量名以字母或下划线开始,后面跟任何字母、数字或下划线。
PHP的系统常量包括5个魔术常量和大量的预定义常量。
魔术常量会根据它们使用的位置而改变,PHP提供的5个魔术常量分别是:
(1)_LINE_:表示文件中的当前行号。
(2)_FILE_:表示文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自PHP 4.0.2起,_FILE_总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
(3)_FUNCTION_:表示函数名称(PHP 4.3.0新加)。自PHP5起,本常量返回该函数被定义时的名字(区分大小写)。在PHP 4中该值总是小写字母的。
(4)_CLASS_:表示类的名称(PHP 4.3.0新加)。自PHP 5起,本常量返回该类被定义时的名字(区分大小写)。在PHP 4中该值总是小写字母的。
(5)_METHOD_:表示类的方法名(PHP 5.0.0新加)。返回该方法被定义时的名字(区分大小写)。
预定义常量又分为内核预定义常量和标准预定义常量两种,内核预定义常量在PHP的内核、Zend引擎和SAPI模块中定义,而标准预定义常量是PHP默认定义的。比如常用的E_ERROR、E_NOTICE、E_ALL等。
2.4.2 PHP中的变量
在PHP中,创建一个变量首先需要定义变量的名称。变量名区分大小写,总是以$符号开头,然后是变量名。如果在声明变量时,忘记变量前面的$符号,那么该变量将无效。在PHP中设置变量的正确方法如下:
在PHP中,可以使用值赋值和引用赋值这两种方法为变量赋值。值赋值是直接把一个数值通过赋值表达式传递给变量。值赋值是一种常量的变量赋值的方法,其使用格式如下所示。
从上述代码中可以看到,在PHP中不需要在设置变量之前声明该变量的类型,而是根据变量被设置的方式,PHP会自动把变量转换为正确的数据类型。
在PHP中,变量的命名规则有如下几点:
● 变量名必须以字母或下划线"_"开头。
● 变量名只能包含字母、数字、字符以及下划线。
● 变量名不能包含空格。如果变量名由多个单词组成,那么应该使用下划线进行分隔(例如$my_string),或者以大写字母开头(例如$myString)。
在PHP中,还支持另一种赋值方式,称为变量的引用赋值,例如:
从这里可以看出,对一个变量值的修改将会导致对另外一个变量值的修改。从本质上讲,变量的引用赋值导致两个变量指向同一个内存地址。因此,不论对哪一个变量进行修改,修改的是同一个内存地址中的数据,从而出现同时被修改的结果。
PHP提供了大量的预定义变量,这些变量在任何范围内都会自动生效,因此通常也被称为自动全局变量(autoglobals)或者超全局变量(superglobals,PHP中没有用户自定义超全局变量的机制)。在PHP 4.1.0之前,如使用超全局变量,人们要么依赖register_globals,要么就是长长的预定义PHP数组($HTTP_*_VARS)。自PHP 5起,长格式的PHP预定义变量可以通过设置register_long_arrays来屏蔽。
常用的超全局变量如下:
● $GLOBALS
包含一个引用指向每个当前脚本的全局范围内有效的变量。该数组的键名为全局变量的名称。从PHP 3开始存在$GLOBALS数组。
● $_SERVER
变量由Web服务器设定或者直接与当前脚本的执行环境相关联。类似于旧数组$HTTP_SERVER_VARS(依然有效,但反对使用)。
● $_GET
经由URL请求提交至脚本的变量。类似于旧数组$HTTP_GET_VARS(依然有效,但反对使用)。
● $_POST
经由HTTP POST方法提交至脚本的变量。类似于旧数组$HTTP_POST_VARS(依然有效,但反对使用)。
● $_COOKIE
经由HTTP Cookies方法提交至脚本的变量。类似于旧数组$HTTP_COOKIE_VARS(依然有效,但反对使用)。
● $_FILES
经由HTTP POST文件上传而提交至脚本的变量。类似于旧数组$HTTP_POST_FILES数组(依然有效,但反对使用)。
● $_ENV
执行环境提交至脚本的变量。类似于旧数组$HTTP_ENV_VARS(依然有效,但反对使用)。
● $_REQUEST
经由GET,POST和COOKIE机制提交至脚本的变量,因此该数组并不值得信任。所有包含在该数组中的变量存在与否以及变量的顺序均按照php.ini中的variables_order配置指示来定义。此数组在PHP 4.1.0之前没有直接对应的版本。
● $_SESSION
当前注册给脚本会话的变量。类似于旧数组$HTTP_SESSION_VARS(依然有效,但反对使用)。
2.4.3 PHP数据类型
数据是程序运行的基础,所有的程序都是在处理各种数据。例如,财务统计系统所要处理的员工工资额、论坛程序所要处理的用户名、密码、用户发贴数等等,所有这些都是数据。在编程语言中,为了方便对数据的处理以及节省有限的内容资源,需要对数据进行分类。PHP支持7种原始类型,分别是:
● boolean(布尔型true/false)。
● integer(整数类型)。
● float(浮点型,也称为double,可用来表示实数)。
● string(字符串类型)。
● array(数组同一变量保存同类型的多条数据)。
● object(对象)。
● 特殊类型(resource资源和NULL未设定)。
下面介绍常用的数据类型。
1.布尔型boolean
布尔型是最简单的类型,它表达了真值,可以为True或False。要指定一个布尔值,使用关键字True或False,并且True或False不区分大小写。例如:
某些运算通常返回布尔值,并将其传递给控制流程。比如用比较运算符(==)来比较两个运算数,如果相等,则返回True,否则返回False。代码如下:
对于如下的代码
可以使用下面的代码代替:
转换成布尔型用bool或者boolean来强制转换,但是很多情况下不需要用强制转换,因为当运算符、函数或者流程控制需要一个布尔参数时,该值会被自动转换。
当转换为布尔型时,以下值被认为是False:
● 布尔值False。
● 整型值0(零)。
● 浮点型值0.0(零)。
● 空白字符串和字符串"0"。
● 没有成员变量的数组。
● 没有单元的对象(仅适用于PHP 4)。
● 特殊类型NULL(包括尚未设定的变量)。
所有其他值都被认为是True(包括任何资源)。
2.整型integer
一个整数是集合Z={…,-2,-1,0,1,2,…}中的一个数。整型值可以用十进制、十六进制或八进制表示,前面可以加上可选的符号(-或者+)。如果用八进制,数字前必须加上0(零),用十六进制数字前必须加上0x。PHP不支持无符号整数。整型数的字长和平台有关,通常最大值大约是二十亿(32位有符号)。如果给定的一个数超出了整型的范围,将会被解释为浮点型,同样如果执行的运算结果超出了整型范围,也会返回浮点型。
要将一个值转换为整型,用int或integer强制转换。不过大多数情况下都不需要强制转换,因为当运算符、函数或流程控制需要一个整型参数时,值会自动转换。还可以通过函数intval()来将一个值转换成整型。
从布尔型转换成整型,False将产生出0,True将产生出1。当从浮点数转换成整数时,数字将被取整(丢弃小数位)。如果浮点数超出了整数范围,则结果不确定,因为没有足够的精度使浮点数给出一个确切的整数结果。
3 浮点型float
浮点数也叫双精度数或实数,可以用以下任何语法定义:
浮点数的字长和平台相关,通常最大值是1.8e+308并具有14位十进制数字的精度。
4 字符串string
字符串是由引号括起来的一些字符,常用来表示文件名、显示消息、输入提示符等。字符串是一系列字符,字符串的大小没有限制。字符串可以用单引号、双引号或定界符3种方法定义,下面分别介绍这3种方法。
(1)单引号
指定一个简单字符串的最简单的方法是用单引号(')括起来。例如:
如果字符串中有单引号,要表示这样一个单引号,和很多其他语言一样,需要用反斜线(\)转义。例如:
如果在单引号之前或字符串结尾需要出现一个反斜线(\),需要用两个反斜线(\\)表示。例如:
对于单引号(')括起字符串,PHP只懂得单引号和反斜线的转义序列。如果试图转义任何其他字符,反斜线本身也会被显示出来。另外,还有不同于双引号和定界符的很重要的一点就是,单引号字符串中出现的变量不会被解析。
(2)双引号
如果用双引号(")括起字符串,PHP懂得更多特殊字符的转义序列(见表2-1)。
表2-1 转义字符
如果试图转义任何其他字符,反斜线本身同样也会被显示出来。双引号字符串最重要的一点是能够解析其中的变量。
(3)定界符
另一种给字符串定界的方法就是使用定界符语法(<<<)。应该在<<<之后提供一个标识符,接着是字符串,然后是同样的标识符结束字符串。例如:
在此段代码中,标识符命名为abc。结束标识符必须从行的第一列开始。标识符所遵循的命名规则是:只能包含字母数字下划线,而且必须以下划线或非数字字符开始。
定界符文本表现的就和双引号字符串一样,只是没有双引号。这意味着在定界符文本中不需要转义引号,不过仍然可以用以上列出的转义代码,变量也会被解析。在以上的3种定义字符串的方法中,若使用双引号或者定界符定义字符串,其中的变量会被解析。
5.数组array
PHP中的数组实际上是一个有序图,图是一种把value映射到key的类型。新建一个数组使用array()语言结构,它接受一定数量用逗号分隔的key=>value参数对。
语法如下:
其中,键key可以是整型或者字符串,值value可以是任何类型,如果值又是一个数组,则可以形成多维数组的数据结构。例如:
此段代码的输出为:列名是id、username、password。
如果省略了键key,会自动产生从0开始的整数索引。上面的代码可以改写为:
此段代码的输出仍为:列名是id、username、password。
如果key是整数,则下一个产生的key将是目前最大的整数索引加1。如果指定的键已经有了值,则新值会覆盖旧值。再次改写上面的代码为:
此段代码的输出仍为:列名是id、username、password。
定义数组的另一种方法是使用方括号的语法,通过在方括号内指定键为数组赋值来实现。也可以省略键,在这种情况下给变量名加上一对空的方括号([])。
语法如下:
其中,键key可以是整型或者字符串,值value可以是任何类型。例如:
此段代码的输出仍为:列名是id、username、password。
如果给出方括号但没有指定键,则取当前最大整数索引值,新的键将是该值加1。如果当前还没有整数索引,则键将为0。如果指定的键已经有值了,该值将被覆盖。
对于任何的类型——布尔、整型、浮点、字符串和资源,如果将一个值转换为数组,将得到一个仅有一个元素的数组(其下标为0),该元素即为此标量的值。如果将一个对象转换成一个数组,所得到的数组的元素为该对象的属性(成员变量),其键为成员变量名。如果将一个NULL值转换成数组,将得到一个空数组。
6.对象object
使用class定义一个类,然后使用new类名(构造函数参数)来初始化类的对象。该数据类型将在后面的实例中具体应用进行解析。
7.其他数据类型
除了以上介绍的6种数据类型,还有资源和NULL两种特殊类型,下面简单介绍一下资源和NULL两种特殊类型。
(1)资源
资源是通过专门函数来建立和使用的一个特殊变量,保存了外部资源的一个引用。可以保存打开文件、数据库连接、图形画布区域等的特殊句柄,无法将其他类型的值转换为资源。资源大部分可以被系统自动回收。
(2)NULL
NULL类型只有一个值,就是区分大小写的关键字NULL。特殊的NULL值表示一个变量没有值。
在下列情况下,一个变量被认为是NULL:
● 被赋值为NULL。
● 尚未被赋值。
● 被unset()。
例如:
结果是什么?
由三种情况下变量被认为是空值:
变量没有被赋值;
变量被赋值为null,0,FALSE或者空字符串;
变量在非空值的情况下,被unset()函数释放。
2.4.4 数据类型转换
在PHP中若要进行数据类型的转换,就要在转换的变量之前加上用括号括起来的目标类型。在变量定义中不需要显示的类型定义是根据使用该变量的上下文所决定的。
例如通过类型的转换,可将变量或其所附带的值转换成另外一种类型:
运行结果如图2-14所示。
图2-14 数据类型的转换
注意
如要将一变量彻底转换成另一种类型,得使用settype(mixed var,string type)函数。
允许的强制转换有:
● int、integer:转换成整型。
● bool、boolean:转换成布尔型。
● float、double、real:转换成浮点型。
● string:转换成字符串。
● array:转换成数组。
● object:转换成对象。