本章着重讲述PHP基本语法、PHP程序的组成以及PHP编码规范,详细讲解PHP数据类型以及数据输出等知识。通过本章的学习,读者可以从整体上认识PHP程序的各个组成部分,并可以制作功能简单的用户注册系统。
2.1 PHP代码基本语法
PHP是一种在服务器端执行的HTML内嵌式的脚本语言,PHP代码可以嵌入到HTML代码中,HTML代码也可嵌入到PHP代码中,例如,程序htmlWithPHP.php如下。
在PHP程序中,所有PHP代码必须位于PHP开始标记和PHP结束标记之间,开始标记用于表示PHP代码的开始,结束标记用于表示PHP代码的结束,这是书写PHP程序代码需要遵守的最基本规则。只有这样,PHP预处理器才能正确识别一个PHP程序中哪些是PHP动态代码,哪些是静态文本,PHP预处理器只会针对PHP动态代码进行分析、处理。
2.1.1 PHP开始标记与结束标记
PHP程序代码共有4种风格的开始标记和结束标记,4种风格的标记作用是等效的。
(1)开始标记“<?php”和结束标记“?>”。这是PHP代码中最为常用的标记风格,在任何情况下都可以使用该标记风格标识PHP代码,程序htmlWithPHP.php使用的就是这种标记。
(2)开始标记“”。这种标记风格可以在任何情况下使用,不过由于程序书写和阅读上的不便,编程过程中使用这种标记风格的几率较小。例如,程序htmlWithPHP.php代码可以修改为如下代码。
(3)开始标记“<?”和结束标记“?>”。这是第一种标记风格的简写方式,由于这种标记风格给程序的书写以及阅读带来很多方便,编程过程中使用这种标记风格的几率较大。不过使用这种标记风格前,必须将php.ini配置文件中的选项short_open_tag设置为On,否则这种标记风格将不起作用。例如,程序htmlWithPHP.php代码可以修改为如下代码。
(4)开始标记“<%”和结束标记“%>”。这是模仿ASP、JSP风格的一种标记,为ASP、JSP编程人员转向PHP编程带来了方便。不过使用这种标记风格前,必须将php.ini配置文件中的选项asp_tags设置为On,否则这种标记风格将不起作用。例如,程序htmlWithPHP.php代码可以修改为如下代码。
2.1.2 PHP注释
为了提高代码的可读性,应该养成注释的习惯,这样才能减少程序代码后期维护的时间。PHP注释和PHP代码相同,必须位于PHP开始标记与结束标记之间;不同之处在于PHP注释的内容会被PHP预处理器过滤,不会被PHP预处理器处理。可以这样理解,PHP代码提供给“PHP预处理器”处理,而PHP注释则是提供给“程序员”处理。PHP支持如下3种注释风格。
第1种:/多行注释风格/
第2种://单行注释风格
第3种:#单行注释风格
例如,下面的程序annotation.php中使用了3种注释风格。
程序annotation.php中,除了存在PHP代码的注释以外,还存在HTML代码的注释(使用注释风格为HTML代码添加注释)。使用HTML代码的这种方法注释时,注释的内容可以在HTML页面源代码中看到。程序annotation.php的运行结果如图2-1所示,右键单击该页面,可以查看该页面的源文件(见图2-2)。通过annotation.php源程序、运行结果以及源文件的对比可以得知,PHP代码中的注释被PHP预处理器忽略,HTML代码中的注释则原封不动地输出到浏览器,浏览器接收到HTML注释后,忽略注释的内容,但该注释内容在源文件中存在。
2.1.3 PHP语句及语句块
PHP程序一般由若干条PHP语句构成,每条PHP语句完成某项操作。PHP中的每条语句以英文分号“;”结束,只有PHP结束标记之前的PHP语句可以省略结尾分号“;”。书写PHP代码时,一条PHP语句一般占用一行,但是一行写多条PHP语句或者一条PHP语句占多行也是合法的(可能导致代码可读性差,不推荐)。
如果多条PHP语句之间密不可分,可以使用“{”和“}”将这些PHP语句包含起来形成语句块。例如,程序sentence.php如下。
单独使用语句块时没有任何意义,语句块只有和条件控制语句(if…else)、循环语句(for和while)、函数等一起使用时才有意义。
2.2 PHP程序的组成
从功能的角度,完整的PHP程序可以划分为3个组成部分:数据的采集、数据的处理和数据的输出,其中PHP的数据采集主要包括3个过程:浏览器端的数据采集、浏览器端数据的提交和PHP程序的数据采集,如图2-3所示。在图2-3中,浏览器用户访问注册页面(如register.html),register.html页面为浏览器用户提供一个图形界面(如FORM注册表单)采集用户的数据。浏览器用户在FORM表单中输入个人信息,单击“提交”按钮后,浏览器负责将用户信息提交到WEB服务器某个动态页面(如register.php程序)。register.php程序负责采集浏览器端的用户信息,再对采集到的用户信息进行数据处理,并将处理结果输出,告知浏览器用户处理结果。
2.2.1 关于PHP数据
数据位于程序的核心,如何快速、安全地管理内存中的数据显得格外重要。PHP与传统的高级语言的相同之处如下。
(1)PHP使用变量或常量实现数据在内存中的存储,并使用变量名(如$userName)或常量名(例如PI)实现了内存数据的按名存取。
(2)PHP使用等于号“=”(赋值运算符)给变量赋值。
(3)PHP不允许直接访问一个未经初始化的变量,否则PHP预处理器会提示类似下面的Notice信息:Notice: Undefined variable: a in C:\wamp\www\2\sample.php on line 2。
(4)PHP提供变量作用域的概念实现内存数据的安全访问控制。
(5)PHP引入了数据类型的概念修饰和管理数据。
PHP与传统的高级语言的不同之处如下。
(1)PHP变量名之前要加美元符号“$”标识,例如变量$userName。
(2)PHP是一种“弱类型的语言”,声明变量或常量时,不需要事先声明变量或常量的数据类型,PHP会自动由PHP预处理器根据变量的值将变量转换成适当的数据类型。例如,程序looseType.php如下。
<?php
$a = 0;
$a = 0.00;
?>
程序looseType.php中创建了一个$a变量,当将整数0赋值给变量$a时,$a是一个整型变量;当将浮点数(带有小数点的数)0.00赋值给变量$a时,$a又变成一个浮点型的变量。
2.2.2 PHP数据类型
PHP数据类型分为4种:标量数据类型、复合数据类型、特殊数据类型和伪类型。其中标量数据类型共有4种:布尔型、整型、浮点型和字符串型。复合数据类型共有两种:数组和对象。特殊数据类型有资源数据类型和空数据类型。伪类型通常在函数的定义中使用。
1.标量数据类型
(1)布尔型(boolean)。布尔型是最简单的数据类型,布尔型的值要么为FALSE(逻辑“假”),要么为TRUE(逻辑“真”),且FALSE和TRUE不区分大小写(如TRUE和true是等效的)。例如,程序boolean.php如下。
<?php
$a = TRUE;
$b = FALSE;
echo $a;
echo "
";
echo $b;
?>
程序boolean.php的运行结果如图2-4所示。
(2)整型(integer)。PHP中整型数据类型的数据指的是不包含小数点的实数。在32位操作系统中,整型数据的有效范围为−2 147 483 648~2 147 483 647。整型数据可以用十进制、八进制或十六进制表示,并且可以包含正号(+)和负号(−)。为了区分十进制数,八进制整数前必须加上0(零),十六进制整数前必须加上0x。例如,程序int.php如下。
(3)浮点型(float或double)。浮点型数据就是通常所说的带小数点的实数。例如,程序float.php如下。
(4)字符串型(string)。字符串数据是一个字符的序列。组成字符串的字符是任意的,可以是字母、数字或者符号,在PHP中没有对字符串的最大长度进行严格的规定。字符串最简单的指定方法是使用一对单引号(')或者一对双引号(")。例如,程序string.php如下。
<?php
$string1 = 'string1';
$string2 = "string2";
$string3 = 'string3$string1'; //$string3变量的值为:string3$string1
$string4 = "string4$string1"; //$string4变量的值为:string3string1
echo $string1; //输出:string1
echo "
";
echo $string2; //输出:string2
echo "
";
echo $string3; //输出:string3$string1
echo "
";
echo $string4; //输出:string4string1
?>
2.复合数据类型
(1)数组(array)。PHP数组由一组有序的变量组成,每个变量称为一个元素,每个元素由键和值构成。由于PHP数组中元素的键不能相等(= =),因此可以根据键唯一确定一个数组元素。同一个PHP数组中,各元素中的键既可以是数字编号,也可以是字符串;同一个PHP数组中,各元素的值既可以是标量数据类型数据,也可以是复合数据类型数据(如数组、对象)。在传统的高级语言中,数组都是静态的,在定义数组前必须指定数组的长度,而在PHP中,数组是动态的,在定义数组时不必指定数组的长度。例如,程序array.php如下。
(2)对象(object)。客观世界中的一个事物就是一个对象,每个客观事物都有自己的特征和行为。从程序设计的角度来看,事物的特征就是数据,也叫成员变量;事物的行为就是方法,也叫成员方法。面向对象的程序设计方法就是利用客观事物的这种特点,将客观事物抽象为“类”,而类是对象的“模板”。例如,程序Student.class.php如下。
程序Student.class.php首先定义了一个Student类,该类由成员变量$name、$sex和$birthday以及成员方法setName($name)和getName()组成。通过对类进行实例化,可以得到一个对象。在程序Student.class.php中,通过使用new关键字实例化一个$student对象,然后就可以使用如下方式访问该对象的成员变量和成员方法。
- 访问成员变量的方法:对象->成员变量(如$student ->name)
- 访问成员方法的方法:对象->成员方法(如$student->getName())
面向对象程序设计是软件设计和实现的有效方法,随着PHP面向对象技术的日趋完善,为了便于程序的模块化开发以及程序的后期维护,很多功能都可以通过PHP面向对象技术实现。
3.特殊数据类型
(1)资源数据类型(resourse)。资源是PHP提供的一种特殊数据类型,这种数据类型用于表示一个PHP的外部资源,如一个数据库的连接或者一个文件流等。PHP提供了一些特定的函数(所谓函数是指完成特定功能的代码段)建立资源和使用资源。例如,PHP提供的mysql_connect()函数用于建立一个MySQL服务器的连接,PHP提供的fopen()函数用于打开一个文件等,这些函数的返回值为资源数据类型。例如,程序resource.php如下,该程序的运行结果如图2-5所示。
resource.php程序中,var_dump()函数的功能是输出函数参数的数据类型。
(2)空(Null)。NULL是一个特殊的数据类型,该数据类型只有一个NULL值,用来标识一个不确定或不存在的数据。NULL不区分大小写,即null和NULL是等效的。例如,程序null.php如下,该程序的运行结果如图2-6所示。
4.伪类型
PHP引入4种伪类型用于指定一个函数的参数或返回值的数据类型。
(1)mixed。mixed 说明函数可以接受(或返回)不同类型的数据(但不是所有类型的数据)。
(2)number。number 说明函数可以接受(或返回)整型或者浮点型数据。
(3)void。void说明函数没有参数或返回值。
(4)callback。callback说明函数可以接受用户自定义的函数作为一个参数。例如,call_user_function()或usort()函数。
2.2.3 浏览器端的数据采集
浏览器端数据的采集主要依靠HTML提供的FORM表单实现。FORM表单是包含一系列表单元素的区域,表单元素是允许用户在表单中输入信息的元素。常见的表单元素有:文本域、下拉列表、单选框、复选框等。以“用户注册系统”为例,创建一个用户注册的FORM表单的方法是:在“C:\wamp\www\2\”目录下新建register.html文件,以记事本方式打开该文件后,输入如下代码并保存该文件。
打开浏览器,在地址栏中输入“http://localhost/2/register.html”回车,即可访问到register.html静态页面,如图2-7所示。
register.html程序说明如下。
(1)HTML中的字符序列“ ”被浏览器解析为一个空格
(2) < form> < /form > 标签是创建FORM表单所需的基本标签,每一个表单必须以