日期:2011-05-28  浏览次数:20601 次

程序控制

本章深入PHP内部,讲述如何使用函数、表达式和语句以实现对程序的控制。

前面的章节初步介绍了怎样操作数据,如果我们将操作数和操作符看作是构筑元件的话,那么它们组合起来即可形成表达式。进一步讲,表达式可以构成语句,语句用于组成函数,而函数则可用来组成程序。


提示:在学习有关编程语言的基本元素时,从全局理解--即理解这些元素是如何组成一个完整程序的--可能非常困难。但也不必着急,乐观一点。接下来的章节将逐步的显示整个程序,并且一点一点的解释它们是如何构造的。

4.1 表达式
当操作数和操作符组合到一起时,它们即组成表达式。本书的例子中已经展示了许多表达式,然而直到现在,我们才开始将注意力集中在它们身上。

表达式是由一个或多个操作符连接起来的操作数,用来计算出一个值--标量或数组。

最基本的表达式就是数字:

12

从这个简陋的开始,将逐步讨论越来越复杂的表达式:

-12
-12 + 14
-12 + 14 * (24 / 12)
(-12 + 14 * (24 / 12))&& calculate_total_cost()

注意每个表达式,在不考虑复杂性的情况下,每一个表达式事实上是由较小的表达式和一个或多个操作数共同组成的。当计算机编程者使用要定义的概念为该概念下定义时,这称为递归。当一个递归完成时,表达式能被分成较更简单的部分,直到计算机能完全的执行每一部分。

4.1.1 简单表达式
简单表达式是由一个单一的赋值符或一个单一函数调用组成的。由于这些表达式很简单,所以也没必要过多讨论。下面是一些例子:
* initialize_pricing_rules() -- 调用函数。
* $str_first_name = 'John' -- 初始化标量。
* $arr_first_names = array( 'John', 'Marie') -- 初始化数组。

4.1.2有副作用的简单表达式
表达式在它的主要任务之外,还有其它的副作用。当一个或几个变量改变了它们的值,并且这些改变并不是赋值操作符的操作结果时,就会出现这种副作用。例如,一个函数调用可以设置全局变量(全局变量是指在函数内部用global关键字来指定的变量),或者加一操作符也可以改变变量的值。副作用会使得程序很难读懂,因此编程的一个目标就是应该尽可能地减少这种副作用。

不使用global关键字是避免副作用的一个好选择。

让我们看看以下有副作用的表达式例子:
* $int_total_glasses = ++$int_number_of_glasses
-- $int_number_glasses变量在加一以后,再把值赋予$int_total_glasses。
* function one() {global $str_direction_name; $str_directory_name = '/dos_data'; }
-- 当one()函数调用后,全局变量的值将被改变。

4.1.3 复杂表达式
复杂表达式可以以任何顺序使用任意数量的数值、变量、操作符和函数。

尽可能使用简短的表达式,这意味着它们更容易维护。

以下是一些例子:
* ((10+2) /count_fishes() * 114)
-- 包含有三个操作符和一个函数调用的复杂表达式。
* initialize_count( 20 -($int_page_number -1) * 2)
-- 有一个复杂表达式参数的简单函数调用。

提示:有时很难分清左括号和右括号的数目是否相同。从左到右,当左括号出现时,就加一,当右括号出现时,就从总数中减一。如果在表达式的结尾时,总数为零时,左圆括号和右圆括号的数目就一定相同了。

4.2 语句
所有的PHP程序都是由语句构成的,无论是简单的语句,还是复杂的语句,这些语句按顺序执行每一时刻执行一句,直到遇到程序结束、跳转语句、分支语句。
最基本的语句是:

;

此语句什么也没有做,但它仍是合法的。分号符是语句结束的标志。如果需要,语句也可以相当复杂。例如:

$str_house_size =(
$int_number_of_rooms > 9 ?
"large" :
"small"
);

这行代码在房子的数目大于9时,给$str_house_size赋予"large",否则给$str_house_size赋予"small"。
就象人类语言中的语句一样,PHP语句可以分为几个组成部分。在PHP中,组成部分可以是数值、变量、函数和关键字。关键字是PHP留作自己用的单词。这些关键字(_FILE_, _LINE_, if, else, elseif, while, do, for, break, continue, switch, case, default, require, include, function),是组成PHP语言必不可少的,使用它们可以控制程序的流程。
本书将不对关键字_FILE_和_LINE_作介绍,相关内容请参考PHP文档。关键字require和include用来读取和执行PHP脚本, 在PHP手册中有详细介绍。以下部分将重点讲述其余的关键字。

4.2.1 语句类型
PHP共有6种类型语句,如表4.1所示。

表4.1 PHP数据类型
语句类型
描述
非执行语句
需要计算但不执行动作。
执行语句
执行某一动作。
赋值语句
给变量赋值。
判断语句
判断条件,并决定执行哪一个动作。
循环语句
重复执行一系列语句直到某条件为真或直到某条件为假为止。
跳转语句
无条件改变程序流程到程序中另一行继续执行。

非执行语句:
所谓非执行语句,就是PHP需要计算,但并不需要执行什么动作的语句。例如:语句10 + 20,其值是30,但由于没有改变哪个变量值,所以也不需要作什么动作。结果值将不保留,当下一条语句出现时,它很快就被丢弃了。
什么动作也不需要做,那么非执行语句又有什么用呢?我不清楚,如果你能发现它们的用途请告诉我。
执行语句:
执行语句是通过表达式来执行某些动作。它们可以增加或减小某一变量值,或者调用一个函数。执行语句是PHP中使用最多的一种语句类型。
赋值语句:
赋值语句并不复杂,它们可以给一个变量赋予一个数值。关于赋值操作符在前一章“PHP中的数据处理”中已经讲过,在此不再过多赘述。
判断语句:
判断语句使用if 和switch关键字,基于一个表达式的计算结果以决定执行某一段语句,或者基于表达式的结果在两段语句行中选择执行其中的一个。例如,如果要处理的支票值大于1000美圆,则执行一段程序;如果支票数小于1000美圆,就执行另一段程序。
if关键字
在if语句中通过计算表达式,得出真或假值,根据所求出的真、假值来决定执行哪一段程序。
最常见的有以下三种类型的if语句:
1.
if ( EXPRESSION ) {
// code block to be executed when
// expression is true.
}
2.
if ( EXPRESSION ) {
// code block to be executed when
// expression is true.
}
else {
// code block to be executed when
// expression is false.
}
3.
if ( EXPRESSION_1 ) {
// code block to be executed when <