深入了解
如果你一直用心学习,你会记得在第二章(http://tech.it168.com/o/2007-08-22/200708221043562.shtml,《PHP开发经典教程(Part 2): 操作符调用》)中,我曾给你上过PHP基本控制结构及操作符的快速速成课。我也向你展示了PHP如何用于处理输入Web表单中的数据。在本部分的教程中,我将深入讲解PHP操作符及控制结构,向你展示两个新的操作符,一种对条件语句if-else()系列结构的替代方法,以及PHP一些更为有趣的循环结构。因此请接着读下去,接下来的内容将会更加有趣!
在不同的情况之间切换
对控制结构的if-else()系列结构的一种替代方法是PHP的switch-case()语句,该switch-case()语句几乎可与if-else()控制结构做同样的事。其结构看起来如下面所示:
根据决策变量的值而执行适当的case()块。switch (decision-variable) {
case first condition is true:
do this!
case second condition is true:
do this!
... and so on...
}
可建立缺省块以处理那些在决策变量的值与所列的case()条件中的任何一个都不相匹配的情况。
我将通过使用switch()语句来重新编写我以前写的例子之一,使得这概念变得稍微清楚一些:
此处有几个重要的关键字:Break关键字用于跳出switch()语句块且立即移动至switch()语句块后的代码行。缺省关键字用于在传递至switch()的变量不满足列在该块内的任何条件时来执行缺省的语句组。<html>
<head></head>
<body>
![]()
<?php
![]()
// get form selection
$day = $_GET['day'];
// check value and select appropriate item
switch ($day) {
case 1:
$special = 'Chicken in oyster sauce';
break;
case 2:
$special = 'French onion soup';
break;
case 3:
$special = 'Pork chops with mashed potatoes and green salad';
break;
default:
$special = 'Fish and chips';
break;
}
![]()
?>
![]()
<h2>Today's special is:</h2>
<?php echo $special ?>
</body>
</html>
在这儿,新手通常所犯的错误是忘记在每一case()块末端的中断语句。请记住,如果你忘记跳出case()块,那么PHP将继续执行其所遇到的所有后继case()块中的代码。
更多关于switch()语句的信息,请参看http://www.php.net/manual/en/control-structures.switch.php.
建立条件
通常地,当建立及处理PHP中的表单时,你将HTML表单置放在一个文档中,且通过单独的PHP脚本来进行表单处理。然而,条件语句能够随你任意使用,你可以据此将两页结合为一页。
怎样进行呢?很简单。所有你需要做的就是对表单提交控制组件赋予一名称,且接着在脚本首次加载时检查特定的$_POST容器变量是否含有该名称。若含有,则表单已经被提交,那么你可以处理数据;若不含有该名称,用户仍然没有提交该表单,那么因此你需要产生最初的,未经填充的表单。因此,通过对提交变量的存在与否的测试,聪明的PHP程序员可使用单一的PHP脚本来产生初始表单及在其提交后在适当的时候的输出。
此处为一简单的例子:
<html>
<head></head>
<body>
![]()
<?php
/* if the "submit" variable does not exist, */
/* the form has not been submitted - display initial page */if (!isset($_POST['submit'])) {
?>
![]()
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Enter your age: <input name="age" size="2">
<input type="submit" name="submit" value="Go">
</form>
![]()
<?php
}
else {
/* if the "submit" variable exists, the form has been submitted - look for and process form data */
// display result
$age = $_POST['age'];
if ($age >= 21) {
echo 'Come on in, we have alcohol and music awaiting you!';
}
else {
echo 'You're too young for this club, come back when you're a little older';
}
}
?>
![]()
</body>
</html>
正如你所见,脚本含有两个页面:初始、空白表单及在点击提交按钮后所获得的结果页。为了决定展示哪一页,脚本首先测试$_POST['submit']变量的存在。若未发现其存在,则假定表单尚未提交,然后展示此时的初始列表。一旦提交表单,将调用相同的脚本以处理表单输入。然而,此时的$_POST['submit']变量将被设定,因此PHP将不展示初始页面,而展示含有结果信息的页面。
请注意,为使此起作用,你的提交按钮“名称(name)”属性必须被赋值,且你必须检查该值是否存在于初始的条件语句中。且倘若你想知道,$_SERVER数组是一特定的PHP变量,该特定的PHP变量总是持有服务器信息,该信息包括当前执行脚本的路径及名称。
接下来讲解循环部分。
一个接一个的来
对于那些你不熟悉的术语,循环是一个能够使你一遍又一遍(重复的实际次数可为你指定的数字或取决于一或多个条件的执行情况)的重复相同的php语句或指令的控制语句。
上次你看到一些比较和逻辑操作符,它们可以帮助我们建立条件语句。因为该教程的本章节将集中于循环结构,所以该到时间向你介绍PHP的自加和自减操作符的时候了,这些操作符在本文中有着多处的运用。
自加操作符为一被设计用来自动增加变量的值的PHP操作符,该操作符所连接变量的值自动加1。其由两个“加”号(++)来表示。下面的代码段可对其进行解释:
<?php
![]()
// define $total as 10
$total = 10;
// increment it
$total++;
// $total is now 11
echo $total;
![]()
?>
因此,$total++功能上等价于$total = $total + 1。
同样,PHP中也存在相应的自减操作符(--),该操作符与自加操作符的行为正好相反:
<?php
![]()
// define $total as 10
$total = 10;
// decrement it
$total--;
// $total is now 9
echo $total;
![]()
?>
这些操作符常常用于循环中,用以更新循环计数器的值,说到循环计数器。
平方运算
在PHP中学习的第一个及最简单的循环是所谓的while()循环,其看起来像如下所示这样:
在此实例中,只要指定的条件所求值为真(记住在第二章中所学的),那么在大括号内的PHP语句将继续执行。条件一旦变成假,循环将断开且其后的语句将得到执行。while (condition is true) {
do this!
}
下面是一解释while()循环的快捷例子。
这是要求用户输入一数字的简单表单。当提交表单时,所调用的PHP脚本应取得该数字且打印在1与所输入的值之间的所有数字的平方。使用while()循环,这个功能实现起来极其简单:<html>
<head></head>
<body>
<form action="squares.php" method="POST">
Print all the squares between 1 and <input type="text" name="limit" size="4" maxlength="4">
<input type="submit" name="submit" value="Go">
</form>
</body>
</html>
该脚本使用while()循环以自1向前计数直到$lowerLimit的值与$upperLimit相等。<html>
<head></head>
<body>
![]()
<?php
![]()
// set variables from form input
$upperLimit = $_POST['limit'];
$lowerLimit = 1;
// keep printing squares until lower limit = upper limit
while ($lowerLimit <= $upperLimit) {
echo ($lowerLimit * $lowerLimit).' ';
$lowerLimit++;
}
// print end marker
echo 'END';
![]()
?>
![]()
</body>
</html>
先循环,再判断条件
while()循环在指定条件为真时而执行一组语句。但如果在循环本身的第一次循环的时候条件为假,那又会如何呢?在以前的例子中,若你在表单中输入0值,那么while()循环连一次也不会执行。自己试一下,你就会明白了。
若你需要执行一组语句“至少”一次,那么PHP提供do-while()循环可以完成这种功能。其看起来像如下所示一样:
do { do this! } while (condition is true)
让我们用一个快捷的例子来更好的理解在while()与do-while()之间的差别:
在该实例中,不论你运行该PHP脚本多少次,你都根本不会得到输出,因为$x的值不等于700。若你运行下列版本的脚本:<?php
![]()
$x = 100;
// while loop
while ($x == 700) ...{
echo "Running...";
break;
}
![]()
?>
<?php
$x = 100;
// do-while loop
do {
echo "Running...";
break;
} while ($x == 700);
?>
你将看到一行输出,因为do()块内的代码将运行一次。
现在让我们来修订之前的PHP脚本以便于其至少运行一次,而不管什么值输入表单中:
<html>
<head></head>
<body>
![]()
<?php
![]()
// set variables from form input
$upperLimit = $_POST['limit'];
$lowerLimit = 1;
// keep printing squares until lower limit = upper limit
do {
echo ($lowerLimit * $lowerLimit).' ';
$lowerLimit++;
} while ($lowerLimit <= $upperLimit);
// print end marker
echo ' END';
![]()
?>
![]()
</body>
</html>
因此,do-while()循环的结构是这样的,首先执行循环内的语句,且然后检查所测试的条件。此意味着大括号内的语句将至少执行一次。
阅读更多关于while()及do-while()循环的内容,请参看http://www.php.net/manual/en/control-structures.while.php与http://www.php.net/manual/en/control-structures.do.while.php。
通过数字来循环
只要所指定的条件表达式保持为真,那么while()与do-while()循环两者都继续重复。但若你需要执行一特定组的语句一特定次数(举例而言,打印一系列13序列数或重复一特定<td>单元格5次),那又怎样呢?在下列实例中,聪明的程序员求助于for()循环。
for()循环通常看起来像下面这样:
for (initial value of counter; condition; new value of counter) { do this! }
看起来有些混乱吗?那么,待在哪儿几分钟。此处“计数器(counter)”为一PHP变量,该变量被初始化为一数字,且跟踪循环执行的次数。在循环的每次执行前,测试“条件”。若其值被计算为真,则循环将再执行一次且计数器将适当增加;若其被计算为假,则循环将断开且其后面的代码行将得到执行。
下列为解释该循环如何使用的一简单例子:
<html>
<head>
<basefont face="Arial">
</head>
<body>
![]()
<?php
![]()
// define the number
$number = 13;
// use a for loop to calculate tables for that number
for ($x = 1; $x <= 10; $x++) {
echo "$number x $x = ".($number * $x)."<br />";
}
![]()
?>
![]()
</body>
</html>
此处我所做的第一件事就是定义用于乘法表的数字。此处我使用了13---没有其他的原因,只是因为其与“green”押韵。
其次,我使用$x作为计数器变量构建for()循环,并将变量$x初始化为1,且指定该循环运行不超过10次。自加操作符(上文已讨论过)在每次执行循环时会自动增加计数1。在循环内,计数器和该数字number相乘以建立乘法表,且echo()用于将结果显示在页面。
表格
正如你刚才所见,for()循环是一非常有趣且有用的编程结构。下一例子将以for()循环应该得到任意HTML程序员喜欢的方式来说明其有用性。
<html>
<head></head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Enter number of rows <input name="rows" type="text" size="4">
and columns <input name="columns" type="text" size="4">
<input type="submit" name="submit" value="Draw Table"></form>
![]()
<?php
![]()
if (isset($_POST['submit'])) {
echo "<table width = 90% border = '1' cellspacing = '5' cellpadding = '0'>";
// set variables from form input
$rows = $_POST['rows'];
$columns = $_POST['columns'];
// loop to create rows
for ($r = 1; $r <= $rows; $r++) {
echo "<tr>";
// loop to create columns
for ($c = 1; $c <= $columns;$c++) {
echo "<td> </td> ";
} echo "</tr> ";
}
echo "</table> ";
}
![]()
?>
![]()
</body>
</html>
正如你所见,若你尝试用手为同样的事情编写相同的代码,那么PHP的for()循环恰恰为你节省了很多的工作!且看起来也很好的是:看一看动态生成的表格的源代码,其看起来格式排的很好,在每一表单元及行的末端之后都有一个换行符。这个不可思议的功能通过在每一次对echo()的调用中强行回车来完成。
关于for()循环的更多的例子,请访问:http://www.php.net/manual/en/control-structures.for.php。
循环经常与PHP更复杂的数据类型结合使用,其被称为数组。其本身为一个完整的主题,且事实上我将在该教程下面的章节中进行详细讨论。接着我将向你展示数组、循环及表单如何一起工作以像吃馅饼一样容易地建立复杂的Web表单。关于那个的细节,我将在第四章中进行阐述。
