
第2章 PHP语言基础
(视频讲解:1小时44分钟)
通过第1章的学习,相信读者对PHP的概念和如何搭建PHP环境有了一个全面的了解,接下来将学习PHP的基础知识。无论是初出茅庐的“菜鸟”,还是资历深厚的“高手”,没有扎实的基础做后盾都是不行的。PHP的特点是易学、易用,但这并不代表随随便便就可以熟练掌握。随着知识的深入,PHP会越来越难学,基础的重要性也就越加明显。掌握了基础,就等于有了坚固的地基,才有可能“万丈高楼平地起”。
学习摘要:
PHP标记风格
PHP注释
PHP数据类型
PHP常量
PHP变量
PHP操作符
PHP表达式
PHP函数
2.1 PHP标记风格

视频讲解
PHP和其他几种Web语言一样,都是使用一对标记对将PHP代码部分包含起来,以便和HTML代码相区分。PHP一共支持4种标记风格,下面分别进行介绍。
1.XML风格

XML风格的标记是本书所使用的标记,也是推荐使用的标记,服务器不能禁用。该风格的标记在XML、XHTML中都可以使用。
2.脚本风格

3.简短风格

4.ASP风格

说明
如果要使用简短风格和ASP风格,需要在php.ini中对其进行配置,打开php.ini文件,将short_open_tag和asp_tags都设置为On,重启Apache服务器即可。
2.2 PHP注释的应用

视频讲解
注释即代码的解释和说明,一般放到代码的上方或代码的尾部(放尾部时,代码和注释之间以Tab键进行分隔,以方便程序阅读),用来说明代码或函数的编写人、用途、时间等。注释不会影响到程序的执行,因为在执行时,注释部分会被解释器忽略不计。
PHP支持3种风格的程序注释。
1.单行注释(//)
这是一种来源于C++语法的注释模式,可以写在PHP语句的上方,也可以写在后方。
写在PHP语句上方:

写在PHP语句后方:

2.多行注释()
这是一种来源于C语言语法的注释模式,可以分为块注释和文档注释。
块注释:

文档注释:

注意
多行注释是不允许进行嵌套操作的。
3.#号风格的注释(#)

注意
在单行注释中的内容不要出现“?>”标志,因为解释器会认为PHP脚本结束,而不去执行“?>”后面的代码。例如:

运行结果如下:
这样会出错的!!!!!不会看到?>
2.3 PHP的数据类型

视频讲解
2.3.1 数据类型
PHP一共支持8种原始类型,包括4种标量类型,即integer(整型)、float/double(浮点型)、string(字符串型)和boolean(布尔型);两种复合类型,即array(数组)和object(对象);两种特殊类型,即resource(资源)与NULL(空)。数据类型及说明如表2.1所示。
表2.1 数据类型

【例2.01】 使用echo语句输出个人信息,包括“姓名”“性别”“年龄”“身高”“体重”,代码如下:(实例位置:资源包\源码\02\2.01)

上述代码中,包含的数据类型有字符串型、整型和浮点型,运行结果如图2.1所示。

图2.1 个人信息输出结果
多学两招
上述代码中,“.”是字符串连接符,<br>是换行标签,echo是PHP的输出语句,将文本内容显示在浏览器上。常用的输出语句还有var_dump()函数和print_r()函数。
2.3.2 数据类型转换
PHP是弱类型语言(或动态语言),不需要像C语言一样在使用变量前必须先声明变量的类型。在PHP中,变量的类型是由赋给它的值确定的。例如:

说明
代码中“=”不是数学中的“等于”,它是赋值操作符,将“=”右边的值赋给“=”左边的变量。
上述代码中,变量$var1为字符串类型,变量$var2为整型。虽然PHP不需要先声明变量的类型,但有时仍然需要用到类型转换。PHP中的类型转换非常简单,只需在变量前加上用括号括起来的类型名称即可。允许转换的类型如表2.2所示。
表2.2 类型强制转换

注意
在进行类型转换的过程中应该注意以下内容:转换成布尔型时,null、0和未赋值的变量或数组会被转换为false,其他的为true;转换成整型时,布尔型的false转换为0,true转换为1,浮点型的小数部分被舍去,字符串型如果以数字开头就截取到非数字位,否则输出0。
类型转换还可以通过settype()函数来完成,该函数可以将指定的变量转换成指定的数据类型。

参数var为指定的变量,参数type为指定的类型,参数type有7个可选值,即boolean、float、integer、array、null、object和string。如果转换成功,则返回true,否则返回false。
当字符串转换为整型或浮点型时,如果字符串是以数字开头的,就会先把数字部分转换为整型,再舍去后面的字符串;如果数字中含有小数点,则会取到小数点前一位。
【例2.02】 使用两种方法将指定的字符串进行类型转换,并比较两种方法之间的不同。代码如下:(实例位置:资源包\源码\02\2.02)

运行结果如图2.2所示。

图2.2类型转换
可以看到,使用(int)能直接输出转换后的变量类型,并且原变量不发生任何变化。而使用settype()函数返回的是布尔值,也就是true,而原变量被改变了。在实际应用中,可根据情况自行选择转换方式。
2.3.3 检测数据类型
PHP还内置了检测数据类型的系列函数,可以对不同类型的数据进行检测,判断其是否属于某个类型,如果符合则返回true,否则返回false。检测数据类型的函数如表2.3所示。
表2.3 检测数据类型

由于检测数据类型的函数的功能和用法都是相同的,下面使用is_numeric()函数和is_null()函数来分别检测变量中的数据是否是数字和变量是否为null,从而了解并掌握is系列函数的用法。代码如下:

运行结果如下:

2.4 PHP常量

视频讲解
常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变,常量默认为大小写敏感。一个常量由英文字母、下画线和数字组成,但数字不能作为首字符出现。传统上常量标识符总是大写的。
2.4.1 定义常量
在PHP中使用define()函数来定义常量,该函数的语法格式如下:

参数说明如下。
constant_name:必选参数,常量名称,即标识符。
value:必选参数,常量的值。
case_sensitive:可选参数,指定是否大小写敏感。设定为true时,表示不敏感。
定义完常量后,使用常量名可以直接获取常量值。例如:

运行结果如下:

2.4.2 预定义常量
在PHP开发过程中,开发者们经常会使用一些通用的信息,PHP已经将这些信息定义为常量,而不需要开发者重新定义,这就是预定义常量。常用的预定义常量如表2.4所示。
表2.4 PHP的预定义常量

注意
__FILE__和__LINE__中的“__”是两条下画线,而不是一条“_”。
说明
表中以E_开头的预定义常量,是PHP的错误调试部分。如需详细了解,请参考error_ reporting()函数。
预定义常量与用户自定义常量在使用上没什么差别,直接获取常量值。例如,下面使用预定义常量输出PHP中的信息。代码如下:

运行结果如下:

说明
根据每个用户操作系统和软件版本的不同,所得的结果也不一定相同。
2.5 PHP变量

视频讲解
把一个值赋给一个名字时,如把值"明日科技小助手"赋给$name,$name就称为变量。在大多数编程语言中,都把这称为“把值存储在变量中”。在计算机内存中的某个位置,字符串序列"明日科技小助手" 已经存在。我们不需要准确地知道它们到底在哪里,只需要告诉PHP这个字符串序列的名字是$name,从现在开始就要通过这个名字来引用这个字符串序列。这个过程就像上门取快递一样,内存就像一个巨大的货物架,在PHP中使用变量就像是给快递盒子加标签,如图2.3所示。

图2.3 货物架中贴着标签的快递
顾客的快递存放在货物架上,上面附着写有名字的标签。当顾客来取快递时,并不需要知道它们存放在这个大型货架的哪个具体位置,只需要提供名字,快递员就会把快递交送到顾客手上。实际上,顾客的快递可能并不在原先所放的位置,不过快递员会记录快递的位置。要取回顾客的快递,只需要提供顾客的名字。变量也一样,我们不需要准确地知道信息存储在内存中的哪个位置,只需要记住存储变量时所用的名字,直接使用这个名字即可。
2.5.1 变量赋值及使用
和很多语言不同,在PHP中使用变量之前不需要声明变量(PHP 4之前需要声明变量),只需为变量赋值即可。PHP中的变量名称用“$符号+标识符”表示。标识符由字母、数字或下画线组成,并且不能以数字开头。另外,变量名是区分大小写的。
变量赋值,是指给变量一个具体的数据值,对于字符串和数字类型的变量,可以通过“=”来实现。格式如下:

对变量命名时,要遵循变量命名规则。例如,下面的变量命名是合法的:

下面的变量命名则是非法的:

除了直接赋值外,还有两种方式可以为变量赋值,一种是变量间的赋值。变量间的赋值是指赋值后两个变量使用各自的内存,互不干扰,代码如下:

运行结果如下:

变量间的赋值就像是在网上买了一个商品后,一天后又下单买了相同的商品。这样在快递点就有两个一样的快递,这两个商品占用两个不同的货架位置,互不干扰。
另一种是引用赋值。从PHP 4开始,PHP引入了“引用赋值”的概念。引用的概念是,用不同的名字访问同一个变量内容。当改变其中一个变量的值时,另一个也跟着发生变化。使用&符号来表示引用。例如,变量$j是变量$i的引用,当给变量$i赋值后,$j的值也会跟着发生变化。代码如下:

运行结果如下:

引用赋值就像在填写快递信息时,为避免和别人重名被人误取,于是在“收货人”位置上写了两个名字,一个是真名,一个是笔名。尽管是两个名字,但却是同一个商品,占用同一个货架。
注意
引用赋值和变量间的赋值的区别在于:变量间的赋值是将原变量内容复制下来,开辟一个新的内存空间来保存,而引用赋值则是给变量的内容再起一个名字。
2.5.2 预定义变量
PHP还提供了很多非常实用的预定义变量,通过这些预定义变量可以获取到用户会话、用户操作系统的环境和本地操作系统的环境等信息。常用的预定义变量如表2.5所示。
表2.5 PHP的预定义变量

2.6 PHP操作符

视频讲解
“+”“-”“*”“/”都称为操作符。这是因为它们会“操作”或处理放在符号两边的数字。“=”也是一个操作符,称为赋值操作符,因为我们可以用它为一个变量赋值。操作符就是会对它两边的东西有影响或者有“操作”的符号。这种影响可能是赋值、检查或者改变一个或多个这样的东西。完成算术运算的“+”“-”“*”“/”都是操作符。PHP的操作符主要包括算术操作符、字符串操作符、赋值操作符、递增或递减操作符、逻辑操作符、比较操作符、条件操作符和位操作符,这里只介绍一些常用的操作符。
2.6.1 算术操作符
算术操作符是处理四则运算的符号,在数字的处理中应用得最多。PHP常用的算术操作符如表2.6所示。
表2.6 PHP常用的算术操作符

说明
在算术操作符中使用%求余,如果被除数($a)是负数,那么取得的结果也是一个负值。
【例2.03】 计算以80km/h的速度行驶200km需要花多长时间,答案为时/分的格式,如X小时Y分钟。相应的公式(用文字表述)是“行驶时间等于距离除以速度”。代码如下:(实例位置:资源包\源码\02\2.03)

运行结果如图2.4所示。

图2.4 显示花费时间
2.6.2 字符串操作符
字符串操作符只有一个,即英文的句号“.”。它将两个字符串连接起来,结合成一个新的字符串。
例如,将"明日科技"和"有限公司"连接起来。代码如下:

运行结果如下:

多学两招
对于字符串型数据,既可以用单引号,也可以用双引号。分别应用单引号和双引号来输出同一个变量,其输出结果完全不同,双引号输出的是变量的值,而单引号输出的是字符串"$i"。例如:

2.6.3 赋值操作符
赋值操作符是把基本赋值操作符“=”右边的值赋给左边的变量或者常量。PHP的赋值操作符如表2.7所示。
表2.7 PHP的赋值操作符

注意
混淆“=”和“==”是编程中最常见的错误之一。
2.6.4 递增或递减操作符
两个加号“++”连接在一起,称为递增操作符。两个减号“--”连接在一起,称为递减操作符。递增或递减操作符有两种使用方法,一种是将操作符放在变量前面,即先将变量作加1或减1的运算后再将值赋给原变量,叫作前置递增或递减操作符,如图2.5所示。

图2.5 前置递增操作符执行顺序
另一种是将操作符放在变量后面,即先返回变量的当前值,然后变量的当前值作加1或减1的运算,叫作后置递增或递减操作符,如图2.6所示。

图2.6 后置递增操作符执行顺序
例如,定义两个变量,将这两个变量分别利用递增和递减操作符进行操作,并输出结果。代码如下:

运行结果如下:

2.6.5 逻辑操作符
逻辑操作符用来组合逻辑运算的结果,是程序设计中一组非常重要的操作符。PHP的逻辑操作符如表2.8所示。
表2.8 PHP的逻辑操作符

在逻辑判断时,经常要使用逻辑操作符,在后续章节中会使用到逻辑操作符。
2.6.6 比较操作符
比较操作符就是对变量或表达式的结果进行大小、真假等比较,如果比较结果为真,则返回true,如果为假,则返回false。PHP的比较操作符如表2.9所示。
表2.9 PHP的比较操作符

其中,不太常见的就是===和!==。$a===$b,说明$a和$b不只是数值上相等,而且两者的类型也一样。例如,false和0,在判断时,它们的关系是相等(==),但不是恒等(===)。
2.6.7 条件操作符(或三元操作符)
条件操作符(?:),也称为三元操作符,用于根据一个表达式在另两个表达式中选择一个,而不是用来在两个语句或者程序中选择。条件操作符最好放在括号中使用。
例如,应用条件操作符实现一个简单的判断功能,如果正确则输出“条件运算”,否则输出“没有该值”。代码如下:

运行结果如下:

2.6.8 操作符的优先级
所谓操作符的优先级,是指在应用中哪一个操作符先计算,哪一个后计算,与数学的四则运算遵循的“先乘除,后加减”是一个道理。
PHP的操作符在运算中遵循的规则是:优先级高的运算先执行,优先级低的操作后执行,同一优先级的操作按照从左到右的顺序进行。也可以像四则运算那样使用小括号,括号内的运算最先进行。表2.10从高到低列出了操作符的优先级。同一行中的操作符具有相同优先级,此时它们的结合方向决定求值顺序。
表2.10 操作符的优先级

这么多的级别,如果想都记住是不太现实的,也没有必要。如果写的表达式很复杂,而且包含了较多的操作符,不妨多使用括号,例如:

这样就会减少出现逻辑错误的可能。
2.7 PHP的表达式

视频讲解
表达式是构成PHP程序语言的基本元素,也是PHP最重要的组成元素。最基本的表达式形式是常量和变量。例如,$m=20,即表示将值20赋给变量$m。表达式是PHP最重要的基石。简单的表达式如以下代码所示:

上述代码是由两个表达式组成的脚本,即$num=12和$a="word"。此外,还可以进行连续赋值,例如:

因为PHP赋值操作的顺序是由右到左的,所以变量$b和$a都被赋值5。
在PHP的代码中,使用分号“;”来区分表达式,表达式也可以包含在括号内。可以这样理解:一个表达式再加上一个分号,就是一条PHP语句。
注意
在编写程序时,应该注意表达式后面的分号“;”不要漏写。
2.8 PHP函数

视频讲解
函数就是可以完成某个工作的代码块,它就像是小朋友搭房子用的积木一样,可以反复地使用。在使用时,只需拿来即用,而不用考虑它的内部组成。PHP函数可以分为两类,一类是内置函数,即PHP自身函数,只需要根据函数名调用即可。PHP备受欢迎的一个原因就是拥有大量的内置函数,包括字符串操作函数和数组操作函数等。例如,var_dump()函数就是输出变量的函数。第二类是自定义函数,就是由用户自己定义的,用来实现特定功能的函数。内置函数可以通过查阅PHP开发手册来学习,下面讲解自定义函数。
2.8.1 定义和调用函数
创建函数的基本语法格式如下:

参数说明如下。
function:为声明自定义函数时必须使用到的关键字。
fun_name:为自定义函数的名称。
$str1…$strn:为函数的参数。
fun_body:为自定义函数的主体,是功能实现部分。
当函数被定义好后,所要做的就是调用这个函数。调用函数的操作十分简单,只需要引用函数名并赋予正确的参数即可完成函数的调用。
例如,定义了一个函数example(),计算传入的参数的平方,然后连同表达式和结果全部输出。代码如下:

运行结果如下:

注意
如果定义了一个函数,但是从未调用这个函数,那么,这些代码将永远也不会执行。
2.8.2 在函数间传递参数
在调用函数时,有时需要向函数传递参数,如图2.7所示。

图2.7 函数传递参数
参数传递的方式有按值传递、按引用传递和默认参数3种。
1.按值传递方式
按值传递方式是最常用的参数传递方式,即将调用者括号内的值依次传递给函数括号内的值。从下面的例子中,验证函数接收参数的顺序。代码如下:

运行结果如下:

2.按引用传递方式
按引用传递就是将参数的内存地址传递到函数中。这时,在函数内部的所有操作都会影响到调用者参数的值。引用传递方式就是传值时在原基础上加&号即可。
举例说明按值传递和按引用传递的区别。
按值传递:张三和李四是同事,张三有一间独立的办公室,张三给李四建筑材料,李四也建造了一个跟张三一模一样的办公室,他们俩在各自办公室办公,彼此独立。
按引用传递:由于公司工费紧张,将李四安排到张三的办公室。二人各有一把钥匙,共用办公室的资源,张三和李四就会相互影响。
例如,下面的代码中,在第一个参数前添加一个&号。代码如下:

运行结果如下:

从运行结果可以看出,第一个参数$parameter1使用引用后,函数体内改变$parameter1的值,调用者的参数$number1也相应改变,而$number2和$number3的值则没有改变。
3.默认参数(可选参数)
还有一种设置参数的方式,即可选参数。可以指定某个参数为可选参数,将可选参数放在参数列表末尾,并且给它指定一个默认值。
例如,使用可选参数实现一个简单的价格计算功能,设置自定义函数values()的参数$tax为可选参数,其默认值为0。第一次调用该函数,并且给参数$tax赋值0.25,输出价格;第二次调用该函数,不给参数$tax赋值,输出价格。代码如下:

运行结果如下:

注意
当使用默认参数时,默认参数必须放在非默认参数的右侧,否则函数可能出错。
2.8.3 从函数中返回值
我们已经知道,可以向函数发送信息(参数),不过函数还可以向调用者发回信息。从函数返回的值称为结果(result)或返回值(return value)。函数将返回值传递给调用者的方式是使用关键字return。return将函数的值返回给函数的调用者,即将程序控制权返回到调用者的作用域。该过程如图2.8所示。

图2.8 函数返回值
【例2.04】 模拟淘宝购物车功能,并计算购物车中商品总价。购物车中有如下商品信息:苹果手机单价5000元,购买数量2台;联想笔记本电脑单机8000元,购买数量10台。操作步骤为:先定义一个函数,命名为total,该函数的作用是输入物品的单价和数量,然后计算总金额,最后返回商品金额。代码如下:(实例位置:资源包\源码\02\2.04)

运行结果如下:

return语句只能返回一个参数,即只能返回一个值,不能一次返回多个。如果要返回多个结果,就要在函数中定义一个数组,将返回值存储在数组中返回。
2.8.4 变量作用域
细心的读者可能注意到,有些变量在函数之外,有些则在函数之内,它们必须在有效范围内使用,如果变量超出有效范围,则变量也就失去其意义了。变量的作用域如表2.11所示。
表2.11 变量作用域

在函数内部定义的变量,其作用域为所在函数,如果在函数外赋值,将被认为是完全不同的另一个变量。在退出声明变量的函数时,该变量及相应的值就会被清除。
2.9 小结
本章主要介绍了PHP语言的基础知识,包括数据类型、常量、变量、操作符、表达式和自定义函数,并详细介绍了各种类型之间的转换、系统预定义的常量和变量、操作符优先级和如何使用函数。基础知识是一门语言的核心,希望初学者能静下心来,牢牢掌握本章的知识,这样对以后的学习和发展能起到事半功倍的效果。
2.10 实战
2.10.1 输出圆周率的近似值
实例位置:资源包\源码\02\实战\01
使用3种书写方法(圆周率函数、传统书写格式和科学记数法)输出圆周率的近似值,运行结果如图2.9所示。

图2.9 3种方法显示圆周率
2.10.2 将华氏温度转化为摄氏温度
实例位置:资源包\源码\02\实战\02
美国洛杉矶当前温度为72华氏温度(F),把温度从华氏度转换为摄氏度(C)。转换公式是C=5/9×(F–32)。运行结果如图2.10所示。

图2.10 将华氏温度转化为摄氏温度