第3章 PHP语言基础 学习目标: 本章介绍PHP语言的基础知识,包括基本语法、数据类型、常量与变量、运算与表达式,通 过大量实例帮助学生学习并理解。通过本章的学习,应可对PHP语言有较为系统的了解,掌 握PHP的语言基础,并能运用本章的知识进行简单的编程。本章学习要求如表3-1所示。 表3-1 本章学习要求 知识要点能力要求相关知识 PHP入门掌握PHP的标记风格、程序注释、在HTML中嵌入PHP XML、ASP、Script 数据类型掌握PHP基本数据类型及数据类型转换,并能简单应用强类型语言 常量与变量掌握常量和变量的定义、应用范围及命名规则转义字符 运算符与表达式熟练使用PHP的运算符与表达式优先级 在第1章中,读者对PHP已经有一定了解,但是编写PHP程序需要对它的语法有一定 的了解。每一种语言都有它的语法特点,PHP主要的语法特点是,所有PHP程序代码都是 被放置在页面文件中的,一般PHP程序被放置在以“php”结尾的页面文件中。当然,也可 以通过修改PHP的配置文件来更改页面的后缀名称。其次,PHP程序代码必须放置在 “”标记中间。还有在PHP语言中,“;”用来分隔单条PHP语句,这与 Java语言及C语言中的用法是一致的。在实际开发过程中,每一条PHP语句都必须以分 号结束,否则会出现错误。 3.1 PHP入门 在介绍PHP 的基本语法前,首先介绍PHP 独特的标记风格、程序注释及如何在 HTNL中嵌入PHP。 3.1.1 PHP标记风格 用户已经知道,要想让Web服务器能够区分PHP代码与普通HTML 代码,就要将 PHP代码放在特殊的标记内,PHP共提供了以下4种不同的标记风格。 1.短标记风格 使用短标记风格的PHP代码如下: 这种标记风格最简单,如果想使用短标记风格开发PHP程序,则必须将PHP配置文 ·58· 件php.ini中的short_open_tag选项值设置为on。不过在一般情况下用户不建议使用这种 标记风格。 2.XML标记风格 使用XML标记风格的PHP代码如下: 这种标记风格可以应用于不同的服务器环境。 3.ASP标记风格 使用ASP标记风格的PHP代码如下: <% echo "Hello,students!"; % > 这种标记风格与ASP或ASP.NET 中的标记风格相同。如果习惯于ASP风格,则可 以使用这种标记方式;如果想使用ASP标记风格开发PHP程序,则必须保证服务器配置文 件php.ini中的asp_tags设置为on。 4.Script标记风格 使用Script标记风格的PHP代码如下: 这种标记风格与JavaScript、VBScript的标记风格相同。如果使用的HTML编译器不 支持其他风格的标记,则可以选择使用这种标记风格。 在实际开发过程中,用户更推荐使用XML标记风格,因为使用该风格的PHP程序具 有更好的可移植性,程序可以在各种服务器环境中正常运行。 3.1.2 PHP程序的注释 注释是程序不可或缺的重要元素。通过注释不仅能够提高程序的可读性,还有利于开 发人员之间的沟通及后期的维护。PHP程序的注释非常灵活,可以采用C、C++的注释方 式,也可以使用UNIX系统中Shell的注释方式。这些不同的注释方式可以同时出现在一 个文件中,被注释的内容都不会被编译器编译。 1.C++语言风格和Shell脚本风格的单行注释 C++和Shell脚本这两种注释风格的共同点都是单行注释,区别是C++语言风格的注 释方式使用“//”实现,而Shell脚本风格的注释方式使用“#”实现。下面看一下使用这两 种注释风格的例子。 【例3-1】 单行注释示例。 ·59· 单行注释 "; #在页面中输出"Hello!" echo "Hello,everyone!"; //在页面中输出"Hello,everyone!" ?> 这不是单行注释,是网页内容 上面程序执行后的输出结果如图3-1所示。 图3-1 单行注释 从页面执行结果可以看出,注释标记与注释内容必须放在PHP开始标志(例如“”)之间,否则注释功能将不起作用,注释内容会作为网页内容在网页 中显示出来。 2.C语言风格的多行注释 当要添加的注释内容非常多时,为了便于阅读,用户通常会将注释内容分成多行。有时 候在调试程序时,也需要将一大段程序代码作为注释内容屏蔽掉。虽然使用“//”或者“#” 都能实现注释功能,但是用户需要在每行的开头都加入注释标记,就会很麻烦。这时候就需 要用到多行注释,PHP采用的是C语言的多行注释风格,注释内容以“/*”开始,以“*/”结 束。下面来看使用这种注释风格的例子。 【例3-2】 多行注释示例。 多行注释 上面程序的输出结果如图3-2所示。 图3-2 多行注释 当使用这种注释风格时,应该注意不要使注释嵌套出现,否则容易出现问题。 3.1.3 在HTML中嵌入PHP 从上面的例子可以看出,在多数情况下,PHP代码都是与HTML代码混杂在一起的。 当包含了PHP程序的页面被请求时,Web服务器会自动编译并处理页面中“”之间的代码,将处理结果以HTML的形式传送到页面,并在页面中显示处理结果。 可以通过下面的例子来了解上述处理结果。 【例3-3】 在HTML中嵌入PHP代码及编译后生成的HTML。 在HTML 中嵌入PHP 上面例子程序经编译后的源代码如下: ·61· 在HTML 中嵌入PHP Hello! Let's begin! 在上面这段代码中,看到的全部都是普通的HTML 代码,这说明PHP 代码已经被 Web服务器编译处理了。 3.2 数据类型 因为PHP是作为一种基于Web页面的嵌入式脚本语言,它的应用环境决定了数据类 型不会很丰富,而且PHP不是强类型的语言,这一点也决定了它对程序中的数据类型的控 制不会很严格。 3.2.1 PHP支持的常见数据类型 PHP对于数据类型的控制其实是非常松散的,不需要类型的声明,不同类型的数据也可 以进行运算,它们之间的转化甚至不需要说明。PHP所支持的主要的数据类型如表3-2所示。 表3-2 PHP支持的主要数据类型 数据类型描 述数据类型描 述 integer 整数 array 数组 float 浮点型数class 类 string 字符串 变量和常量是PHP所要处理的基本的数据对象。常量的值和含义在程序运行中都是 不会改变的,而变量是为了在程序运行过程中存储临时信息,或者用于保存中间结果而引用 的,一旦程序运行结束,其在内存中所占用的临时空间就要被收回,它自然也就没有了。 3.2.2 数据类型转换 绝大多数编程语言(如C语言和Java语言)在声明变量的时候,必须明确指定变量的数 据类型,并且一旦指定了某一变量的数据类型,该变量就只能存储这一种类型的数据。 PHP语言在数据类型的定义方面与其他编程语言有所区别。下面用户通过两个例子来比 较一下PHP语言与其他语言在定义数据类型时的不同之处。 例如,在Java语言中,定义两个变量,如下面的代码所示: String a="hello"; //定义一个String 类型的变量a int b=1; //定义一个int 类型的变量b 而在PHP语言中,这两个变量定义的格式如下面的代码所示: ·62· $a="ok"; //定义一个变量a $b=2; //定义一个变量b 通过比较上面两段代码不难发现,同样是定义两个变量,在PHP语言中用户并没有为 变量指定任何数据类型。这在很多语言中是不允许的,但是在PHP语言中则不会出现任 何问题。 例如,在PHP中还可以这样使用变量,如下面的代码所示: $a="test"; //定义一个变量a,并将字符串"test"赋给a $a=3; //将数字3 赋给a 在上面的代码中,当字符串"test"赋值给变量a的时候,变量a成为一个字符串型的变 量;而当数字3赋值给变量a时,变量a成为一个整型的变量。 用户能够像上面两个例子中那样定义和使用变量,主要由PHP语言类型转换的特殊 性决定。PHP中的类型转换包括两种方式,即自动类型转换和强制类型转换。下面分别介 绍这两种类型转换的实现方式及应用过程。 1.自动类型转换 自动类型转换是指,在定义变量时不需要指定变量的数据类型,PHP会根据引用变量 的具体应用环境将变量转换为合适的数据类型。在对变量进行赋值操作的时候,经常会用 到自动类型转换,主要包括如下两种方式。 (1)直接对变量进行赋值操作。直接对变量进行赋值操作是自动类型转换最简单的应 用,变量的数据类型由赋予的值决定。也就是说,当把一个字符串类型的数据赋给变量时, 该变量就是一个字符串类型的变量;当把一个整型数据赋给变量时,该变量就是一个整型的 变量。 (2)运用运算式结果对变量进行赋值操作。自动类型转换的第2种应用方式就是将一 个运算式的结果赋值给一个变量。这种自动类型转换方式又可分为以下两种情况。 ① 运算数为同一数据类型。这种情况处理起来比较简单,由于参与运算的所有运算数 都是同一类型,所以被赋值的变量也属于这种类型。例如下面给出的代码: $a=1.223; $b=3.1415; $c=$a+$b; 变量a与变量b都是浮点型变量,这两个变量进行相加运算并将运算结果赋值给变量 c,此时,变量c就成为了一个浮点型变量。 ② 运算数为不同数据类型。如果所有运算数都是数字,则将选取占用字节最长的一种 运算数的数据类型作为基准数据类型;如果运算数为字符串,则将该字符串转型为数字然后 再进行求值运算。字符串转换为数字的规定为如果字符串以数字开头,则只取数字部分而 去除数字后面部分,根据数字部分构成决定转型为整型数据还是浮点型数据;如果字符串以 字母开头,则直接将字符串转换为0。 例如下面给出的代码: $a=1+1.223; $b=2+"3.141miao"; ·63· $c=3+"world"; 在第1个赋值运算式中,运算数包含了整型数字“1”和浮点型数字“1.223”,根据规定取 浮点型数据类型作为基准数据类型。赋值后变量a的数据类型为浮点型。 在第2个赋值运算式中,运算数包含了整型数字2和字符串型数据"3.141miao",首先将字 符串转换为浮点型数据3.141,然后进行加法运算。赋值后变量b的数据类型为浮点型。 在第3个赋值运算式中,运算数包含了整型数字3和字符串型数据"world",首先将字 符串转换为整型数字0,然后进行加法运算。赋值后变量c的数据类型为整型。 2.强制类型转换 强制类型转换允许用户手动将变量的数据类型转换成为指定的数据类型。PHP强制 类型转换与C语言中的类型转换相似,都是通过在变量前面加上一个“( )”,并把目标数 据类型填写在“( )”中实现的。 在PHP中强制类型转换的具体实现方式如表3-3所示。 表3-3 强制类型转换的实现方式 转换格式转换结果实现方式 (int),(integer) 将其他数据类型强制转换为整型 $a="3"; $b=(int)$a; 或$b=(integer)$a; (bool),(boolean) 将其他数据类型强制转换为布尔型 $a="3"; $b=(bool)$a; 或$b=(boolean)$a; (float),(double),(real) 将其他数据类型强制转换为浮点型 $a="3"; $b=(float)$a; $c=(double)$a; $d=(real)$a; (string) 将其他数据类型强制转换为字符串$a=3; $b=(string)$a; (array) 将其他数据类型强制转换为数组$a="3"; $b=(array)$a; (object) 将其他数据类型强制转换为对象$a="3"; $b=(object)$a; 虽然PHP提供了比较宽泛的类型转换机制,为开发者提供了很大便利,但同时也存在 着一些问题———比如将字符串型数据转换为整型数据该如何转换、将整型数据转换为布尔 型数据该如何转换等。如果没有对上述类似的情形做出明确规定,则在处理类型转换问题 时就会出现一些问题。幸运的是,PHP提供了相关的转换规定。 (1)其他数据类型转换为整型。其他数据类型转换为整型的规则如表3-4所示。 表3-4 其他数据类型转换为整型 原类型目标类型转换规则 浮点型整型 向下取整,即不会四舍五入而是直接去掉浮点型数据小数点后边的部分,只保 留整数部分 ·64· 续表 原类型目标类型转换规则 布尔型整型true转换成整型数字1,false转换成整型数字0 字符串整型 (1)字符串为纯整型数字,转换成相应的整型数字 (2)字符串为带小数点的数字,转换时去除小数点后面的部分,保留整数部分 (3)字符串以整型数字开头,转换时去除整型数字后面的部分,然后按照规则 (1)进行处理 (4)字符串以带小数点的数字开头,转换时去除小数点后面的部分,然后按规 则(2)进行处理 (5)字符串内容以非数字开头,直接转换为0 【例3-4】 其他数据类型转换为整型。 "; echo (int)$b."
"; echo (int)$c."
"; echo (int)$d."
"; echo (int)$e."
"; echo (int)$f."
"; echo (int)$g."
"; echo (int)$h."
"; ?> 上面的程序执行后的结果如下: 12 12 3 3 0 1 0 3 浮点型数据向整型数据转换的时候,可能会出现一些不可预料的结果。如下面两行 代码: ·65· echo (int)0.1*0.7*100; echo (int)1/3; 按照转换规则,得到的结果应该为7 和0,但实际运行以后得到的结果却是6 和 0.33333333333。之所以得到这样的结果,是由于将浮点型数据向整型数据进行转换的 时候出现了精度损失。如果需要高精度的运算结果,就不能采取这种强制类型转换的 方式。 (2)其他数据类型转换为浮点型。其他数据类型转换为浮点型的规则如表3-5 所示。 表3-5 其他数据类型转换为浮点型 原类型目标类型转换规则 整型浮点型将整型数据直接转换为浮点型,数值保持不变 布尔型浮点型true转换成浮点型数字1,false转换成浮点型数字0 字符串浮点型 (1)字符串为整型数字,直接转换成相应的浮点型数字 (2)字符串以数字开头,转换时去除数字后面的部分,然后按照规则(1)进行处理 (3)字符串以带小数点的数字开头,转换时直接去除数字后面的部分,只保留数字 部分 (4)字符串以非数字内容开头,直接转换为0 【例3-5】 其他数据类型转换为浮点型。 "; echo (float)$b."
"; echo (float)$c."
"; echo (float)$d."
"; echo (float)$e."
"; echo (float)$f."
"; echo (float)$g."
"; ?> 上面的程序的执行结果如下: 34 45 2.75 0 ·66· 123 01 (3)其他数据类型转换为布尔型。其他数据类型转换为布尔型的规则如表3-6所示。 表3-6 其他数据类型转换为布尔型 原 类 型目标类型转换规则 整型布尔型0转换为false,非零的其他整型数字转换为true 浮点型布尔型0.0转换为false,非零的其他浮点型数字转换为true 字符串布尔型空字符串或字符串内容为零转换为false,其他字符串转换为true NULL 布尔型直接转换为false 数组布尔型空数组转换为false,非空数组转换为true 【例3-6】 其他数据类型转换为布尔型。 "; echo ((boolean)$b)."
"; echo ((boolean)$c)."
"; echo ((boolean)$d)."
"; echo ((boolean)$e)."
"; echo ((boolean)$f)."
"; echo ((boolean)$g)."
"; echo ((boolean)$h)."
"; echo ((boolean)$i)."
"; echo ((boolean)$j)."
"; ?> 上面的程序的执行结果如下: false true false true ·67· false false true false true false (4)其他数据类型转换为字符串。其他数据类型转换为字符串的规则如表3-7 所示。 表3-7 其他数据类型转换为字符串 原类型目标类型转换规则 整型字符串转换时直接在整型数据两边加上“"”作为转换后的结果 浮点型字符串转换时直接在浮点型数据两边加上“"”作为转换后的结果 布尔型字符串true转换为字符串"1",false转换为字符串"0" 数组字符串直接转换为字符串"Array" 对象字符串直接转换为字符串"Object" NULL 字符串直接转换为空字符串 【例3-7】 其他数据类型转换为字符串。 "; echo (string)$b."
"; echo (string)$c."
"; echo (string)$d."这里显示为空字符串
"; echo (string)$e."
"; echo (string)$f."这里显示为空字符串
"; ?> 上面的程序执行后的结果如下: 314 3.14 1 这里显示为空字符串 Array 这里显示为空字符串 ·68· (5)其他数据类型转换为数组。其他数据类型转换为数组的规则如表3-8所示。 表3-8 其他数据类型转换为数组 原类型目标类型转换规则 整型 浮点型 布尔型 字符串 数组 将这几个数据类型强制转换为数组时,得到的数组只包含一个数据元素,该数据就 是未转换前的数据,并且该数据的数据类型也与未转换前相同 对象数组 转换时将对象的成员变量的名称作为各数组元素的key,而转换后数组每个key的 value都为空 (1)如果成员变量为私有的(private),则转换后key的名称为“类名+成员变量名” (2)如果成员变量为公有的(public),则转换后key的名称为“成员变量名” (3)如果成员变量为受保护的(protected),则转换后key的名称为“*+成员变 量名” NULL 数组直接转换为一个空数组 【例3-8】 其他数据类型转换为数组。 "; echo var_dump((array)$b)."
"; echo var_dump((array)$c)."
"; echo var_dump((array)$d)."
"; echo var_dump((array)$e)."
"; echo var_dump((array)$f); ?> 上面的程序执行后的结果如下: array(1) { [0]=>int(34) } array(1) { [0]=>float(2.718) } array(1) { [0]=>bool(FALSE) } array(1) { [0]=>string(4) "good" } array(1) { [Apri]=>NULL [Apro]=>NULL [Apub]=>NULL } array(0) { } ·69· (6)其他数据类型转换为对象。其他数据类型转换为对象的规则如表3-9所示。 表3-9 其他数据类型转换为对象 原类型目标类型转换规则 整型 浮点型 布尔型 字符串 对象 将其他类型变量转换为对象时,将会新建一个名为scalar的属性,并将原变 量的值存储在这个属性中 数组对象 将数组转换为对象时,数组的key作为对象成员变量的名称,对应各个key 的value作为对象成员变量保存的值 NULL 对象直接转换为一个空对象 【例3-9】 其他数据类型转换为对象。 13,"b"=>14,"c"=>15); $f=(object)"test"; //将字符串转型为对象并赋给变量f echo $a->scalar."
"; echo $b->scalar."
"; echo $c->scalar."
"; echo $d->scalar."
"; echo $e->c."
"; echo $f->scalar."
"; ?> 上面代码运行的结果如下: 10 3.141 true 15 test 3.3 常量与变量 常量和变量是PHP要处理的基本的数据对象。常量中最典型的一个例子就是圆周 率,常量的值在程序运行前后是不会改变的。而变量是为了在程序运行过程中暂时保存一 些中间结果的,它的值在程序运行期间是可以改变的。 ·70· 3.3.1 常量 本节将要介绍PHP语言中的一个重要的概念———常量。常量就是从程序开始运行到 结束都不变的量。在PHP中,常量是一种词法符号,用来表示固定的数值或字符,一旦定 义初值,数值就不能再改变。在传统的程序中,常量是不经过任何说明就可以使用的,但是 在脚本语言中,常量就有了一些变化。在PHP中主要有两种常量:普通常量和定义常量。 1.普通常量 普通常量就是那些在程序中不变的值,它们不是符号,而是实在的数值或字符,如字符 串"china"。普通常量可根据它们的值的类型的不同分成以下几类:数值常量、字符常量、 字符串常量。 (1)数值常量。数值常量主要分两种:整型和实型的常量。 整型的常数可以是十进制的、八进制的、十六进制的。十进制的常量就是由0~9这10 个数码组成的整数,除了0以外,这个数的第一个数码不能是0。八进制的常量就是由0~7 这8个数码组成的整数,不能有超过这个范围以外的数码。八进制的数是以0开头的。 十六进制的常量是由0~9这10个数码加上A~F这6个字母组成的,它的开头必须是0x。 整型常量的前面可以加负号或者正号来表示它们的值的正负,和用户通常书写的习惯一样, 正号一般都省略。下面是一些数值常量的例子: 12345 0123 3456 0x678 0x981EA 0xedac 实型常量只能用十进制表示,它有两种表示形式,一种是普通的小数点形式,另一种是 指数形式。例如,1.23E-7就是一个标准的指数形式,其中的1.23是尾数,-7为指数。 PHP处理实型常量的方法很奇特,尤其是在数值计算当中的默认的类型转换当中,这 在以后会详细地说明。下面是一些实型常量的例子,有普通的小数形式,也有指数形式: 1234.456 389.245 156.379e15 1.234e-10 (2)字符常量。PHP中的字符常量和C语言中的字符常量完全相同,是一个用“'”括起 来的字符。如a' '、b' '、c' '、d' '、'D'、'?' 等都是字符常量。注意,d' '和'D'是不同的字符常量。其中 “'”的作用就是告诉解释器,“" "”之间的是一个字符常量。它本身并不是这个字符常量的 内容。另 外,PHP也支持C语言中的转义序列。所谓的转义序列,就是用转义字符“\”后面跟 一个字符或者是整型常量来表示一个单一的字符。若转义字符后面是一个整型常量,则这 个常量必须是一个八进制或者十六进制的整数,例如'\0x123'、'\0176'等。但是这些数字的 值不能大于256。 在实际应用当中,转义字符常用来表示那些不能从键盘上输入或者是在屏幕上显示的 字符。为了便于记忆,用户将PHP中常用的转义字符序列写成一张表,如表3-10所示。 注意:把“'”和“"”作为转义字符时,因为它们在PHP中有特殊的含义,例如“'”表示字 符常量,“"”表示字符串常量。不过“'”也可以表示字符串常量。这将在字符串常量中介绍。 (3)字符串常量。字符串常量就是由“" "”括起来的字符序列。它也是最常用的常量 类型。它主要分为两种:单引号字符串和双引号字符串。 ·71· 表3-10 PHP常用转义字符 表 示功 能表 示功 能 \' 单引号\\ 反斜杠 \" 双引号\r 回车 \t 制表符\012 任意一个八进制数 \n 换行符\0x34 任意一个十六进制数 \$ 美元符号 单引号字符串就是用单引号括起来的一串字符。例如: 'I am a beautiful girl.' 'I want to drink tea.' 在单引号字符串中,只能对“'”和“\”进行转义,而其他的转义字符都会被原样输出,也 就是说,单引号字符串中可以出现除了“'”和“\”之外的所有其他字符。例如,字符串 '"world\t\n\r\023\0x78\\\'a\'' 的输出是 "world\t\n\r\023\0x78\'a' 其中,只有“\\”和“\’”被转义输出。单引号字符串有一个重要的特点是如果需要在字符串 中换行,不需要用转义字符,只需简单地在源码中键入换行符即可。 【例3-10】 测试换行符。 测试换行符 first step: open the door of the fridge. second step: put the elephant into the fridge. last stap: close the door of the fridge. "; ?> 浏览器的显示结果如图3-3所示。 双引号字符串跟单引号字符串类似,不过它是用“" "”括起来的一串字符。例如: "I am a beautiful girl. " ·72· 图3-3 演示换行符的输出 "It is a sunny day today. " 双引号字符串的特点就是可以在字符串中加入转义字符序列和进行变量替换,需要注 意的是“'”不必经过转义就可以直接输出。 2.定义常量 定义常量是指那些用函数定义的常量。这种常量通常都是某些字符串或者是表达式的 值的别名。也就是说,是为了方便才定义它们的。定义常量分为两种:内部常量和自定义 常量。 (1)内部常量。PHP内部定义了很多常量,它们都是有特殊含义的。以下一些常量便 是在PHP中定义的内部常量。 ① PHP_VERSION。这个内部常量是PHP程序的版本,如4.0.1-dev。 ② PHP_OS。这个内部常量指的是执行PHP解释器的操作系统的名称,如Windows。 ③ _FILE_。这个内部常量是PHP程序文件名。若包含文件(include或require),则 在包含文件内的该常量为包含文件名,而不是包含它的文件名。 ④ _LINE_。这个内部常量是PHP程序的行数。若包含文件(includes或require),则 在包含文件内的该常量为包含文件的行,而不是包含它的文件行。 ⑤ E_ERROR。这个常量指最近的出错的地方。 ⑥ E_NOTICE。这个常量指发生不寻常但又不一定是错误的地方。例如存取一个不 存在的变量。 ⑦ E_PARSE。这个常量是解释语法有潜在问题处。 ⑧ E_WARNING。这个常量指上一个警告处。 ⑨ TRUE。这个常量就是逻辑真值true。 ⑩ FALSE。这个常量就是指逻辑假值false。 在上面这些内部常量中,以E_开头的形式的常量可以参考error_reporting()函数,有 更多的相关说明。 (2)自定义常量。由于PHP语言和所有其他脚本语言一样,所有的变量不经过说明就 可以赋值,赋值时赋给变量的值就是一个传统意义上的常量。PHP中对常量有专门的定义 ·73· 和使用的方法,此时PHP定义的常量与C语言中使用命令#define定义的常量是完全类似 的。也就是说,PHP中的常量特指使用这种方式定义的具有特定含义的符号。 PHP内部定义了很多常量,它们都是有特殊含义的,上面已经介绍了。当然,编写程序 时,仅仅使用上面那些内部常量是不够的。对于这一点,PHP提供了define()的功能,它使 程序员可以自己定义所需要的常量。 【例3-11】 自己定义常量。 从上面的例子可以看出,上面的代码是给一个字符串"ourlifeissobeautiful"起了一个 名字,称为theme,它可以像变量一样使用。这可以防止用户一遍又一遍地写一个很长的字 符串,只需用一个符号代替即可,既简便又防止了写长字符串出错。实际上,这完全与C语 言中的#define的功能一样。 3.3.2 变量 变量用于存储值,例如数字、文本字符串或数组。一旦设置了某个变量,用户就可以在 脚本中重复地使用它。命名一个变量的标识符号就是该变量的变量名。所谓的变量的声 明,是指程序通知解释程序为这个变量预留一定的存储单元。由于PHP是脚本语言,所以 它和其他脚本语言一样,都可以直接使用变量,而不用声明变量。也就是说,当需要的时候, PHP解释器可以动态地为变量分配内存。 1.变量类型 PHP的变量类型常用的有5种:string、integer、double、array、object。 (1)string即为字符串变量,无论是单一字符还是数千字的字符串,都是使用这个变量 类型。值得注意的是,要指定字符串给字符串变量,就要在字符串的头尾加上“"”(例如: "这是字串")。在欲让字串换行时,可使用溢出字元,也就是“\”加上指定的符号,若是“\x” 加上两位数字,如“\xFE”即表示十六进位字符,如表3-11所示。 表3-11 溢出字元表示法 符 号意 义符 号意 义 \\ 反斜线\n 换行 \" 双引号\t 跳位TAB \r 送出CR 初始化字符串变量,用户只要简单的给它赋值即可。例如: $mystring="我的字符串"; $name="me"; (2)integer为整数变量。在32位的操作系统中,它的有效范围是-2147483648~ ·74· 2147483647。要使用十六进制整数,可以在前面加0x。 初始化整型变量的示例如下: $grade=90; $age=21; $hexint=0x24; (3)double 为浮点数变量。在32 位的操作系统中,有效范围是1.7×10-308 ~ 1.7×10308。 初始化浮点数变量的示例如下: $float1=2.712; $float2=3.14E+2; (4)array为数组变量,可以是二维、三维或者多维数组,其中的元素也很自由,可以是 string、integer或者double,甚至是array。 数组变量可以使用这两种方法来赋值:使用一系列连续数值,或使用array()函数构造 (见Arrayfunctions部分)。要将连续的数值加进数组,只需将要赋的值赋给不带下标的数 组变量。该值会作为数组的最后元素加进数组中。例如: $names[]="zhang"; //$names[0]="wang" $names[]="li"; //$names[1]="zhao" 与C、Perl相似,PHP数组的下标也是从0开始的。 数组的使用示例如下: $array1=array("子", "丑", "寅", "卯"); $array2=array( "天干"=>array("甲","乙","丙","丁"), "地支"=>array("子", "丑", "寅", "卯"), "数字"=>array(1, 2, 3, 4)); (5)object为对象变量,目前在PHP中的对象不多,若论及对象,虽然微软公司的ASP 对象仍然比PHP的内部对象多,但是,WebCGI程式要求的是效率,以完全类导向的方式, 恐怕使用者在浏览时也会因为程式执行速度过慢而很不耐烦。 要初始化一个对象,就需要用new语句建立该类型的变量。 class foo { function do_foo() { echo "Doing foo."; } } $bar=new foo; $bar->do_foo(); 还有布尔值(boolean),通常1即为true,0为false。 ·75· PHP程序可以在变量之间自由地转换形态,不必经过特殊的转换,但是在浮点数转成 整数时就有点牵强了,不过可以先将浮点数转成字串,然后再处理。 2.变量的命名规则 变量的命名规则如下。 (1)变量名必须以字母或者“_”开头。 (2)变量名只能包含字母、数字字符以及“_”。 (3)变量名不能包含空格。如果变量名由多个单词组成,那么应该使用“_”进行分隔 (如$my_string),或者以大写字母开头(如$myString)。 要使用变量,只要在英文字串前面加“$”即可,目前变量名称仍不能使用中文。至于变 量的大小写是不一样的,而且在设置变量名的时候一定要含义明确,而不要用那些含义不明 的变量名,例如$a、$b、$c等。在开发PHP程序时,最好使用一定的变量名风格(指变量 名中的单词的拼写、大小写、间隔等所使用的统一的规范),以免因为变量大小写的问题,花 许多无谓的时间去找寻问题点,这样会很麻烦。 下面介绍两种变量名风格。 (1)UNIX的变量名风格。间隔使用“-”,变量名一律小写,单词用全名或者是公认的简 写法,例如: $studentname="xiaoming"; $code=3; (2)Windows变量名风格。变量名中的每个单词首字母大写,其余全部小写;单词用全 名或者是公认的简写法,例如: $StudentName="zhangsan"; $Code=153; 以下是一些不好的变量名风格: $int1=20; $string1="beautiful"; $float1=3.14; 在这些例子中,除了程序的编写者,其他人很难知道$int1代表什么,但是如果要问 $studentname是什么意思,可以很容易看出来,它代表的意思是学生姓名。这就是使用有 意义的变量名的好处。 对于变量,还有两个比较重要的特性,变量的作用域和变量的生命周期,这需要涉及函 数,放到后面讲完函数后再讲。 3.变量的声明和初始化 PHP中可以直接使用变量,而不用提前声明一个变量及其类型。PHP中的所有变量 都以“$”开始。 在PHP中设置变量的正确方法如下: $varname=value; ·76· PHP是一门松散类型的计算机语言。在PHP中,不需要在设置变量之前声明该变量, 也不需要提前定义其类型。它们的类型只能在初始化的时候由系统自动确定,当初始化的 值为整型时,其类型即为整型;当初始化值为字符串时,即为string类型。例如: $name; $class; $code; 这些均是PHP中的变量的形式,但是它们的类型都不能确定。当赋值后类型即确定 了。例如: $name="yuanyuan"; $class="yiban"; $code=153; 以上的变量name和class即为string型,code即为int型。 需要注意的是,声明的变量和初始化时(即赋值)的类型应该一致,如果不一致,编译时 也不会出错。因为在PHP中不进行类型检查,而是直接对变量做强制的类型转换,得出的 结果可能和预期的结果有很大的不同。所有,用户一定要记住这一点。 PHP的入门者往往会忘记在变量的前面的“$”。如果那样做,变量将是无效的。 下面试着创建一个存有字符串的变量和一个存有数值的变量,如例3-12所示。 【例3-12】 创建字符串变量及数值变量。 在上面的例子可以看到,不必向PHP声明该变量的数据类型。根据变量被设置的方 式,PHP会自动地把变量转换为正确的数据类型。而在强类型的编程语言中,必须在使用 前声明变量的类型和名称。 在PHP中,变量会在使用时被自动声明。 3.4 运算符与表达式 运算符指对操作数所进行的运算。操作数可以是前面所讲的常量或变量或下面将要讲 到的表达式。与C语言一样,PHP中的运算符也可以分为单目运算符、双目运算符和三目 运算符。这里的“目”指的就是操作数。几目就是指该运算符可以对几个操作数同时进行操 作。按运算符的功能分,基本的运算符类型可以分为算术运算符、赋值运算符、关系运算符、 逻辑运算符、位运算符、字符串运算符以及其他运算符。 PHP中的表达式是通过递归的方式定义的,定义如下。 (1)一个操作数就是一个表达式。 (2)由运算符连接在一起的两个操作数构成一个表达式。 (3)由运算符连接在一起的两个表达式构成一个表达式。 ·77·