6.3 PHP基本语法
作为一种编程语言,PHP大量借用了C、C++、和Perl语言的语法,同时加入了一些其他语法特征,使之编写Web程序更快、更有效。本节将介绍PHP的基本语法。
6.3.1 数据类型
PHP与多种程序语言一样,把数据分成多种类型,数据的类型决定了数据所占用的内存空间,所能表示的数值范围及程序对其处理的方式。PHP与C#、Java等“强类型”语言不同,是一种弱类型语言。所谓弱类型程序语言就是数据在使用之前无须声明类型,并在运行期间可根据实际情况动态转换类型。举例来说,PHP会将带引号的“2+23”视为字符串;而把2+“23”看作整数25,也就是先把字符串“23”转换成整数23,再与2相加,最终得到25。
PHP拥有8种类型,其中4种标量类型:布尔类型(boolean)、整型(integer)、浮点型(float)、字符串(string);两种复合类型:数组类型(array)、对象类型(object);两种特殊类型:资源(resource)、NULL。本章将主要介绍除对象类型外的7种,对象类型将留到第8章进行介绍。
1.整型
整型是最简单的数据类型,PHP所支持的整数取值范围与C语言的long类型相同,PHP接受十进制、八进制、十六进制整数,为区分各种进制,八进制整数的前面加上0作为区分,十六制整数的前面加上0x作为区分。
6-2.php
<?php echo 5+5; ?><br/> <!--十进制整数相加,输出十进制整数10--> <?php echo 010+05; ?><br/> <!--八进制整数相加,输出十进制整数13--> <?php echo 0x5+0xB; ?><br/> <!--十六制整数相加,输出十进制整数16-->
注意:当使用超过整数范围的整数时,PHP会自动将其类型转换成浮点数类型。
2.浮点型
浮点数指的是实数,可以通过小数点与科学计数法来表示浮点数。其中,科学计数法的科学符号E或e没有大小写之分。
6-3.php
<?php echo -456.789 ?> <br/><!-- 显示负数-456.789--> <?php echo +45.3 ?> <br/><!-- 显示正数45.3 --> <?php echo 0.12345678912345678 ?> <br/> <!--显示0.12345678912346 多出 位数被四舍五入 --> <?php echo 4.5678e+2; ?> <br/><!--显示456.78 --> <?php echo -4.5678e+3; ?><br/><!--显示-4567.8 -->
3.布尔型
布尔类型只能表示true(真)或false(假)两种值(true和false没有大小写之分)。布尔类型通常用作表示表达式是否成立。当需将布尔数据转换成数值类型,true转换成1,false转换成0;当将布尔数据转换成字符串类型时,true转换成字符串“1”,false转换成字符串“0”;当将非布尔数据转换成布尔类型时,只有下列数据会转换成false,其他数据均会转换成true,包括所有负数及任何有效资源。
(1)整数0;
(2)浮点数0.0;
(3)空字符串“”与字符串“0”;
(4)没有元素的数组;
(5)没有成员的对象;
(6)特殊类型NULL(包括尚未设置的变量)。
4.字符串
任何由字母、数字、文字、符号组成的单字或词组、句子都叫作字符串。PHP规定字符串前后必须加上引号(单引号或双引号)。注意:双引号与单引号一定要配对使用。另外,如果用单引号表示字符串时,字符串会单纯被视为纯文字。当字符串用双引号表示时,PHP会对字符串进行相应处理,比如进行变量解析或解译“转义字符”。
1)单引号字符串
单引号字符串有两个转义符:\\和\’ ,分别会被解析为\和’。
6-4.php
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> </head> <body> <?php echo 'Hello! <br/>' ?> <?php echo'你好! <br/>' ?> <?php echo 'Today is fine.\n <br/>'?>-\n会直接显示,并不会被解译成换行字符 <?php echo 'Today is fine .\\n<br/>'?>-----\\n会显示为\n ,\\会被解译成 <?php echo 'This book is \'php\' <br/>'?>-------------\'会被解译成' <?php echo 'This book is "php" <br/>'?> <?php $str='php'; echo 'This is a $str book<br/>' ?>------------------------$str会直接显示 <?php//echo 'This book is 'php' <br/>'?>--------包含非法字符串‘,因为’ 为该字符串的定界符。须标识成注释,否则该语句是错误的 </body> </html>
程序运行结果如图6-2所示。
2)双引号字符串
双引号字符串比单引号字符串支持更多转义符,并且会进行变量解析。
转义字符 | 说明 |
\n | 换行 |
\r | 回车 |
\t | 制表符 |
\$ | 美元符号 |
\\ | 反斜杠字符 |
\” | 双引号 |
6-5.php
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> </head> <body> <?php echo "Hello! <br/>" ?> <?php echo"你好! <br/>" ?> <?php echo "Today is fine.\n <br/>"?>----\n不会直接显示,被解译成换行字符 <?php echo "Today is fine .\\n<br/>"?>-----\\n会显示为\n ,\\会被解译成 <?php echo "This book is \"php\" <br/>"?>-------------\"会被解译成" <?php echo "This book is 'php' <br/>"?> <?php $str="php"; echo "This is a $str book <br/>" ?>----------会显示$str的值php <?php//echo "This book is "php" <br/>"?>-------包含非法字符串",因为"为 该字符串的定界符。须标识成注释,否则该语句出错 </body> </html>
运行结果如图6-3所示。
注意:PHP虽然提供了“\n”作为换行符,“\r”作为回车符,“\t”作为制表符,但是在网页上并不能实现其功能。如需换行还需使用HTML标记<br>、<p>。
3)变量解析
在双引号字符串中会进行变量解析,在PHP中解析程序一碰到$符号,就会取得$符号后不是英文字母、阿拉伯数字及下划线_的字符之间的字符串,将把它当成变量名称,如程序中没有这个变量,会自动忽略。
6-6.php
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> </head> <body> <?php $str="php"; echo "this is a $str book<br/>"; echo "this is a $strbook<br/>";------输出为this is a 因为解析$后的变 量名为strbook,而程序中无该变量,会自动忽略 ?> </body> </html>
运行结果如图6-4所示。
如要顺利产生预期结果可加入{}标识明确标识变量名称。
6-7.php
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> </head> <body> <?php $str="php"; echo "this is a $str book<br/>"; echo "this is a {$str}book<br/>";//输出为this is a phpbook ?> </body> </html>
运行结果如图6-5所示。
5.NULL
凡类型为NULL的变量,就只有一种值——常量NULL(无大小写之分),所表示的意义为没有值。例如:
$str=null; //变量str 设置为null
6.资源
“资源”类型所代表的是一种特殊类型,用来保存PHP外部资源的引用,例如数据库、文件、图形画布等。通常资源是通过专门的函数自动创建的,例如,函数mysql_connect()执行后创建一个连接MySQL数据库的连接,该连接就是一个资源,并把该外部资源的引用赋值给变量v_resource。
$v_resource=mysql_connect();
资源并不需要手动释放,PHP Zend Engine会自动管理所有资源,当其自动检测到一个资源不再被引用了,该资源会被垃圾回收系统释放。
注意:持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。
7.类型转换
PHP会视实际情况自动转换类型,其规则如表6-2所示。
原始类型 | 目的类型 | 说明 |
float | Integer | 取出整数部分,小数部分无条件舍去,例如:5.6转换为5 |
boolean | Integer float | false转换成0,true转换成1 |
string | Integer | 从字符串开头部分取出整数,如果字符串中不包含整数,就被转换为0。例如:“5A”,“89.1bc”,“x78”会被转换为5,89,0 |
Integer | float | 在整数后直接加上小数点及0 |
Integer float | boolean | 0会转换成false,非0会被转换成true |
string | boolean | 空字符串""或字符串"0"会转换成false,其他会转换成true |
Integer float | string | 将所有数字(包含小数点)转换成字符串,例如整数567会转换成“567”,小数123.456会转换成“123.456” |
boolean | string | false会转换成空字符串"",true会转换成字符串“1” |
NULL | integer float | 0 |
NULL resource | boolean | false |
resource | string | 转换成类似“Resource id #1”的字符串 |
resource array object | integer float | 没有定义 |
Array | Boolean | 不包含数组成员的数组会转换成false,否则会转换成true |
Array | String | 字符串“array” |
Object | boolean | 不包含成员的对象会转换成false,否则会转换成true |
Object | String | 字符串“object” |
Integer float Boolean String | Array | 创建一个新数组,数组第一个成员就是该整数、浮点数、布尔或字符串 |
6.3.2 常量与变量
1.常量
“常量”是一个有意义的名称,但是在程序运行过程中其值不能被改变。可以使用以下函数创建常量。
define(name,value[,case_insensitive]);
(1)name:第一个参数为string,代表常量的名称,常量的名称就是一个标识符,标识符需符合PHP的命名规范,要以字母或下划线开头,后面可以跟任何字母、数字或下划线。默认情况下,常量大小写敏感,但通常采用大写,但注意常量名前不要加“$”。
(2)value:第二个参数为标量类型,表示常量的值。
(3)case_insensitive:第三个参数为布尔类型,是可选项,通常被省略。该选项表示常量的名称是否有大小写之分,如需设置成无大小写之分,可以将该参数值设置为true。
6-8.php
<?php define(P,3.14159);//定义常量P,其值为3.14159 echo P; ?>
除了可以自定义常量外,PHP还提供了系统预定义常量。常用系统预定义常量如表6-3所示。
常量名 | 功能 |
__FILE__ | 文件的完整路径和文件名 |
__LINE__ | 当前行号 |
__CLASS__ | 类的名称 |
__METHOD__ | 类的方法名 |
PHP_VERSION | PHP版本 |
PHP_OS | 运行PHP程序的操作系统 |
DIRECTORY_SEPARATOR | 返回操作系统分隔符 |
true | 逻辑真 |
false | 逻辑假 |
NULL | 一个null值 |
E_ERROR | 最近的错误之处 |
E_WARNING | 最近的警告之处 |
E_PARSE | 解析语法有潜在的问题之处 |
E_NOTICE | 发生不同寻常的提示之处,但不一定是错误处 |
注意:表中系统预定义常量“__FILE__”、“__LINE__”、“__CLASS__”、“__MET HOD__”中的“__”是两个下划线。
6-9.php
<?php echo '本文件路径和文件名为'.__FILE__.'<br />';//显示本文件路径和文件名 echo '当前行数为:'.__LINE__.'<br />'; //显示当前行在文件中的行数 echo '当前的PHP版本为:'.PHP_VERSION.'<br />'; //显示当前PHP版本为:5.2.6 ?>
2.变量
变量就是在程序中所使用的一个名称,计算机会为这个名称预留内存空间,然后就可以通过它保存各种类型的数据,被保存的数据被称为变量的值。在程序运行过程中可修改变量的值。变量名前必须加上字符$,变量名的定义要遵循以下规则。
(1)变量名的第一个字符必须是字母或下划线“_”,其他字符可是英文字母、下划线或阿拉伯字母,注意英文字母有大小写之分。
(2)不能使用PHP的保留关键字、内置变量的名称、内部函数的名称、内部对象的名称作为变量名。
(3)变量名中不能包含空格。如果变量名由多个单词组成,应使用下划线进行分隔(比如$my_string),或者以大写字母开头(比如$myString)。
以下是变量定义的几个例子。
$php_var //合法变量名 $_var //合法变量名 $3var //非法变量名,不应以数字开头 $my$var //非法变量名,包含非法字符$ $my@var //非法变量名,包含非法字符@ $my var //非法变量名,包含空格
3.变量的访问方式
PHP属于动态类型程序语言,所以变量在使用之前无须声明类型,并且可以在程序运行期间动态转换类型,变量的值以最近一次赋的值为准。变量赋值有两种方式:传值和引用。这两种赋值方式在对数据处理上存在很大差别。
(1)传值赋值。使用“=”直接将赋值表达式的值赋给另一个变量。
(2)引用赋值。将赋值表达式内存空间的引用赋给另一个变量。需要在“=”右边的变量前面加上一个“&”符号。在使用引用赋值的时候,两个变量将会指向内存中同一存储空间。因此任何一个变量的变化都会引起另外一个变量的变化。
6-10.php
<?php $one="jaky"; $two=&$one; echo '$one='.$one."<br>"; echo '$two='.$two."<br>"; $two="mary"; //$two指向$one,当$two赋值为"mary",$one的值也为"mary" echo '$one='.$one."<br>"; echo '$two='.$two."<br>"; ?>
运行结果如图6-6所示。
4.变量的作用域
变量的“作用域”指的是在程序中哪些代码块能够访问该变量。在PHP脚本的任何位置都可以声明变量,但是,变量声明的位置会影响访问变量的范围,如果超出变量可访问范围,则变量就失去了意义。在PHP中,按照变量作用域不同将变量分为局部变量、全局变量。
1)局部变量
在函数内定义的变量,称为局部变量。局部变量的作用域范围为所在函数体。
6-11.php
<?php function Test() { $a=2; //$a为局部变量 echo $a; } Test(); ?>
运行结果如图6-7所示。
2)全局变量
与局部变量相反,PHP程序中的任何代码都可访问全局变量。被定义在所有函数以外的变量,其作用域是整个PHP文件;函数内部使用全局变量,在变量前面加上关键字GLOBAL声明。
6-12.php
<?php $a=2; //$a为全局变量 function Test() { global $a; echo $a; } Test(); ?>
运行结果如图6-8所示。
注意:当全局变量与局部变量同名时,在局部变量作用域范围,局部变量有效。
6-13.php
<?php $a=2; //全局变量 function Test() { $a=1; echo $a; //输出局部变量$a的值1 } Test(); ?>
运行结果如图6-9所示。
5.可变变量
可变变量是指可以动态设置变量名称,来看下面的例子。
6-14.php
<?php $var="happy"; //声明变量var $$var="birthday"; //声明一个以变量var值为变量名的变量,也就是声明了变 量happy echo $var."<br/>"; //输出变量var的值 echo $$var."<br/>"; //输出以变量var值为变量名的变量的值,也就是输出变量 happy的值 echo $happy; //输出变量happy的值 ?>
运行结果如图6-10所示。
6.3.3 运算符
运算符可以针对一或多个元素进行运算,PHP按照所执行功能的不同可分为:赋值运算符、算术运算符、比较运算符、逻辑运算符、按位运算符、字符串运算符、数组运算符、类型运算符等。以下将对常用的运算符进行详细介绍。
1.赋值运算符
赋值运算符是二元运算符,所谓二元运算符就是运算符有两个操作数,PHP中的赋值运算符如表6-4所示。
运算符 | 举例 | 展开形式 | 功能 |
= | $a = 100 | $a = 100 | 将右边的值赋值给左边 |
+= | $a += 100 | $a = $a + 100 | 将左边的值加上右边的值赋值给左边 |
-= | $a -= 100 | $a = $a - 100 | 将左边的值减去右边的值赋值给左边 |
*= | $a *= 100 | $a = $a * 100 | 将左边的值乘以右边的值赋值给左边 |
/= | $a /= 100 | $a = $a / 100 | 将左边的值除以右边的值赋值给左边 |
.= | $a .= 100 | $a = $a . 100 | 将左边的字符串连接到右边赋值给左边 |
%= | $a %= 100 | $a = $a % 100 | 将左边的值对右边的值取余赋值给左边 |
2.算术运算符
算术运算符用来执行数学上的算术运算,包括加、减、乘、除等。PHP中的算术运算符如表6-5所示。
运算符 | 名称 | 举例 | 结果 |
- | 取负运算 | -$a | $a的负数 |
+ | 加法运算 | $a + $b | $a和$b的和 |
- | 减法运算 | $a - $b | $a和$b的差 |
* | 乘法运算 | $a * $b | $a和$b的积 |
/ | 除法运算 | $a / $b | $a和$b的商 |
% | 取余数运算 | $a % $b | $a和$b的余数 |
++ | 自增运算 | $a++ , ++$a | $a的值加1 |
-- | 自减运算 | $a-- , --$a | $a的值减1 |
下面来看一个简单的算术运算符示例。
6-15.php
<?php $a = -100; $b = 50; $c = 30; echo '$a = '.$a.','; //$a = -100 echo '$b = '.$b.','; //$b = 50 echo '$c = '.$c.'<p/>'; //$c = 30 echo '$a + $b = '.($a + $b).'<br/>'; //计算变量$a加$b的值-50 echo '$a - $b = '.($a - $b).'<br/>'; //计算变量$a减$b的值-150 echo '$a * $b = '.($a * $b).'<br/>'; //计算变量$a乘$b的值-5000 echo '$b / $a = '.($b / $a).'<br/>'; //计算变量$b除以$a的值-0.5 echo '$a % $c = '.($a % $c).'<br/>'; //计算变量$a除以$c的余数值-10 echo '$b % $a = '.($b % $a).'<br/>'; //计算变量$b除以$a的余数值50 echo '$a++ = '.($a++).' '; //对变量$a进行后置自增运算 echo '运算后$a的值为:'.$a.'<br/>'; echo '$b-- = '.($b--).' '; //对变量$b进行后置自减运算 echo '运算后$b的值为:'.$b.'<br/>'; echo '++$c = '.(++$c).' '; //对变量$c进行前置自增运算 echo '运算后$c的值为:'.$c.'<br/>'; echo '--$c = '.(--$c).' '; //对变量$c进行前置自减运算 echo '运算后$c的值为:'.$c.'<br/>'; ?>
运行结果如图6-11所示。
注意:
(1)加号也可以用来表示正值,比如+5可以表示为正整数5,减号也可以用来表示负值,例如-5表示负整数5。
(2)假如运算符两边的任一操作数或两个操作数不为值类型(integer, float,double),那么PHP会根据表6-2数据类型转换原则,将操作数转换成值类型,再进行算术运算,例如2+true会得到3,因为true会先转换成整数1;2+false得到2,因为false会先转换成整数0。
6-16.php
<?php echo 2+ TRUE ; echo 2+ FALSE; ?>
3.字符串运算符
字符串运算符是英文句号.,其用途是连接字符串。若字符串运算符左右两边的任一操作数或两个操作数不为string类型,那么PHP会根据表6-2数据类型转换原则,将操作数转换成string类型,再进行运算。
6-17.php
<?php echo "HTML"."5"."<br/>"; echo "HTML". 5 ."<br/>";//首先将整型数值5转换成字符串"5",再进行字符串 连接操作 ?>
运行结果如图6-12所示。
4.比较运算符
比较运算符会比较左右两边的操作数,正确则返回true,否则返回false。PHP中的比较运算符如表6-6所示。
运算符 | 名称 | 举例 | 功能 |
== | 等于 | $a == $b | 如果 $a等于 $b,返回true |
=== | 全等于 | $a === $b | 如果 $a等于 $b,并且它们的类型也相同,返回true |
!= <> | 不等 | $a!= $b $a <> $b | 如果 $a不等于 $b,返回true |
!== | 不全等 | $a !== $b | 如果 $a不等于 $b,或者它们的类型不同,返回true |
< | 小于 | $a < $b | 如果 $a小于 $b,返回true |
> | 大于 | $a > $b | 如果 $a大于 $b,返回true |
<= | 小于或等于 | $a <= $b | 如果 $a小于或者等于 $b,返回true |
>= | 大于或等于 | $b >= $a | 如果 $a大于或者等于 $b,返回true |
5.逻辑运算符
逻辑运算符用来操作布尔型数据,处理后的结果仍为布尔型数据。PHP中的逻辑运算符如表6-7所示。
运算符 | 名称 | 举例 | 功能 |
and、&& | 逻辑与 | $a && $b | 如果$a和$b都为true,返回true |
or、|| | 逻辑或 | $a || $b | 如果$a和$b其中一个为true,返回true |
xor | 逻辑异或 | $a xor $b | 如果$a和$b一真一假时,返回true |
not或! | 逻辑非 | ! $a | 如果$a不为true,返回true |
6.位运算符
计算机中的各种信息都是以二进制的形式存储的,PHP中的位运算符允许对整型数值进行二进制位从低位到高位对齐后进行运算。PHP中的位运算符如表6-8所示。
运算符 | 名称 | 举例 | 功能 |
& | 按位与 | $a & $b | 如果$a和$b的相对应的位都为1,则结果的该位为1 |
| | 按位或 | $a | $b | 如果$a和$b的相对应的位有一个为1,则结果的该位为1 |
^ | 按位异或 | $a ^ $b | 如果$a和$b的相对应的位不同,则结果的该位为1 |
~ | 按位取反 | ~$a | 将$a中为0的位改为1,为1的位改为0 |
<< | 左移 | $a << $b | 将$a在内存中的二进制数据向左移动$b个位数(每移动一位相当于乘以2),右边移空部分补0 |
>> | 右移 | $a >> $b | 将$a在内存中的二进制数据向右移动$b个位数(每移动一位相当于除以2),左边移空部分补0 |
下面来看一个关于位运算符的示例。
6-18.php
<?php echo "位运算符的例子!<br>"; $a=5; //用二进制表示a=101; $b=2; //用二进制表示b=010; $c=$a&$b; //与运算 echo "a & b = ".$c." (101 & 010)<br>"; $c=$a|$b; //或运算 echo "a | b = ".$c." (101 | 010)<br>"; $c=~$a; //取反运算,相当于改变这个数值的符号同时将其减1 echo "~a = ".$c." (~101)<br>"; $c=$a^$b; //异或运算 echo "a ^ b = ".$c." (101 ^ 010)<br>"; $c=$a<<$b; //向左移位运算 echo "a << b = ".$c." (101 << 010)<br>"; $c=$a>>$b; //向右移位运算 echo "a >> b = ".$c." (101 >> 010)<br>"; $c=true xor true; var_dump($c); ?>
运行效果如图6-13所示。
7.条件运算符
条件运算符是三元运算符,其语法如下,如果条件表达式的结果为true,就返回第一个表达式的值,否则返回第二个表达式的值。
条件表达式?表达式1:表达式2
6-19.php
<?php echo 3>2 ? "yes" :"no"; ?>
运行结果如图6-14所示。
8.错误控制运算符
PHP支持一个错误控制运算符“@”,当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
6-20.php
<?php $err = (10 / 0) ; //如去掉字符"@",会显示错误提示 ?>
9.运算符的优先级
当表达式中出现一种以上的运算符时,PHP会依照如表6-9所示的优先级运行运算符,如需改变默认的优先级,可以加上小括号(),PHP就会优先运行小括号内的表达式。
结合方向 | 运算符 | 优先级 |
非结合 | new | 1 |
非结合 | [] | 2 |
非结合 | ++ , -- | 3 |
右 | ! , ~ , (float) , (int) , (string) , (object) , @ | 4 |
左 | * , / , % | 5 |
左 | + , - , . | 6 |
左 | << , >> | 7 |
非结合 | < , <= , > , >= | 8 |
非结合 | == , != , <> , === , !== | 9 |
左 | & | 10 |
左 | ^ | 11 |
左 | | | 12 |
左 | && | 13 |
左 | || | 14 |
左 | ?: | 15 |
右 | 赋值运算符 | 16 |
左 | and | 17 |
左 | xor | 18 |
左 | or | 19 |
左 | , | 20 |
6.3.4 流程控制
前面所使用的示例都是简单的程序,所谓的“简单”,就是程序运行从上而下逐行执行,不能跳转。但实际上大部分程序不会这么简单,会根据实际情况而转弯或跳行,这样可以提高程序的处理能力,于是就需要“流程控制”来协助程序员控制程序的运行方向。
PHP程序流程控制分为以下三种类型。
1.判断结构
判断结构可以根据程序员提供的条件表达式的结果,而选择执行不同语句。PHP支持以下判断结构:
if (if…, if…else, if…elseif…)
1)单分支if语句
语法格式:
if(expr) //注意:此语句后不要加分号 statements; //条件成立则执行的语句(块)
判定expr表达式返回的布尔值,如果为真,那么执行statements语句,如果为假,则跳过statements语句。要执行的statement语句为多条时,把语句放在“{}”中,“{}”称为语句块。
6-21.php
<?php $score=80; if ($score>=60) { echo "<br>合格"; } ?>
运行结果如图6-15所示。
2)双分支if…else语句
语法格式:
if(expr) { statements1 ; } else { statements2; }
判定expr表达式返回的布尔值,如果为真,那么执行statements1语句,如果为假,则执行statements2语句。
6-22.php
<?php $score=80; if ($score>=60) { echo "<br>合格"; } else { echo "<br>不合格"; } ?>
运行结果如图6-16所示。
3)多分支if…elseif…else语句
语法格式:
if(expr1) { statements1 ; } elseif(expr2) { statements2; }… else { statementsn; }
判定expr1表达式返回的布尔值,如果为真,那么执行statements1语句,如果为假,判断expr2表达式返回的布尔值,如果为真,执行statements2语句,如果为假,继续判断下面的表达式真假性,如果所有的表达式布尔值都为假,则执行statements n语句。
6-23.php
<?php $score=30; if ($score>=80) { echo "<br>优秀"; } else if ($score>=60) { echo "<br>合格"; } else { echo "<br>不合格"; } ?>
运行结果如图6-17所示。
4)switch语句
switch语句也是一种多分支结构,虽然使用elseif语句可以进行多重判断,但是书写过于复杂。
switch语句的语法格式:
switch(expr) { case value1 : statement1; break; case value2 : statement2; break; … default : statementn; }
首先计算expr表达式的值,然后依次用expr的值和value值进行比较,如果相等,就执行该case下的statement语句,直到switch语句结束或者遇到第一个break语句为止;如果不相等,继续查找下一个case;一般switch语句都有一个默认default,表示如果前面的value值都和expr值不匹配,则执行statement n语句。
注意:在switch语句中,不论statement是一条语句还是若干条语句构成的语句块,都不适用“{}”。
6-24.php
<?php $score=80; switch($score) { //计算$score的值 case $score >= 90 : //开始判断,不满足继续向下判断 echo "<br/>优秀"; break; case $score >= 80 : //满足条件 echo "<br/>良好"; //合格 break; //碰到break,结束switch语句 case $score >= 60 : echo "<br/>合格"; break; default: echo "<br/>不合格"; } ?>
运行结果如图6-18所示。
2.循环结构
循环结构可以重复运行某些程序代码,PHP支持如下循环结构。
1)for循环
for循环在明确知道循环次数的情况下使用。
语法格式:
for (expr1; expr2; expr3) { statements ; }
其中,表达式expr1在循环开始前无条件计算一次,对循环控制变量赋初值;表达式expr2为判断条件,在每次循环开始前计算expr2,如果值为真,则执行循环体,如果表达式值为假,则终止循环;expr3在每次循环体执行之后被执行。每个表达式都可以为空。如果表达式exp2为空,则会无限循环下去,需要在循环体statements中使用break语句来结束循环。
6-25.php
<?php echo "10以内的正整数有 : <br/>"; //输出提示语句“10以内的正整数有” for($num = 0 ; $num <=10 ; $num++) { //初始化$num,判断,满足条件执行循环语句块 echo $num." "; //循环显示0 1 2 3 4 5 6 7 8 9 10 } ?>
运行效果如图6-19所示。
2)while循环
while循环是PHP中最常见的循环语句,语法格式如下。
while(expr) { statements; }
如果expr表达式的值为真,则执行statements语句,执行结束后,再次返回判断expr表达式的值是否为真,为真还要继续执行statements语句,直到expr表达式的值为假,才跳出循环,执行while循环后面的语句。
这里与if语句一样,如果statements语句有多条时,可以使用“{}”将多条语句组成语句块。
6-26.php
<?php $num = 0; echo "10以内的正整数有 : <br/>"; //10以内的正整数有: while($num <=10) //条件满足,开始循环 { echo $num . " ";//循环显示0 1 2 3 4 5 6 7 8 9 10 $num++; //改变循环条件,防止死循环 } ?>
运行效果如图6-20所示。
3)do …while循环
do…while循环与while循环的差别在于:do…while循环的循环体至少执行一次。语法格式:
do{ statements ; } while(expr) ;
首先执行循环体statements语句,然后判断expr表达式的值,如果expr表达式的值为真,重复执行statements语句,如果为假,跳出循环,执行do…while循环后面的语句。
6-27.php
<?php $num = 0; echo "10以内的正整数有 : <br/>"; //10以内的正整数有: //条件满足,开始循环 do { echo $num . " "; //循环显示0 1 2 3 4 5 6 7 8 9 10 $num++; //改变循环条件,防止死循环 } while($num <=10) ?>
运行结果如图6-21所示。
4)foreach循环
foreach循环是PHP 4引进来的,只能用于数组。在PHP 5中,又增加了对对象的支持,语法格式如下。
foreach (array_expr as $value) { statement ; }
或
foreach (array_expr as $key=>$value) { statement ; }
foreach语句将遍历数组array_expr,每次循环时,将当前数组元素的值赋给$value,如果是第二种方式,将当前数组元素的键赋给$key,直到数组到达最后一个元素。当foreach循环结束后,数组指针将自动被重置。
6-28.php
<?php $arr = array('this' , 'is','an','example');//声明一个数组并初始化 //使用第一种foreach循环形式输出数组所有元素的值 foreach ( $arr as $value){ echo $value." "; //this is an example } echo "<br/>"; //使用第二种foreach循环形式输出数组所有的键值和元素值 foreach($arr as $key=>$value) { echo $key . "=>" . $value." "; //0=>this 1=>is 2=>an 3=>example } ?>
运行结果如图6-22所示。
3.跳转控制语句
PHP提供了break语句及continue语句用于实现循环跳转,下面分别介绍一下各自的用法。
1)break语句
break语句用于中断循环的执行。对于没有设置循环条件的循环语句,可以在语句任意位置加入break语句来结束循环。在多层循环嵌套的时候,还可以通过在break后面加上一个整型数字“n”,终止当前循环体向外计算的“n”层循环。
6-29.php
<?php for ($a=1;$a<=10;$a++) { for ($b=1;$b<=10;$b++) { echo '$a:'.$a.'$b:' .$b."<br/>"; break; //只终止内层循环 } } echo "--------------------------------------------<br/>"; for ($a=1;$a<=10;$a++) { for ($b=1;$b<=10;$b++) { echo '$a:'.$a.'$b:' .$b."<br/>"; break 2;//终止内外两层循环 } } ?>
运行效果如图6-23所示。
2)continue语句
continue语句用于中断本次循环,进入下一次循环,在多重循环中也可以通过在continue后面加上一个整型数字“n”,告诉程序跳过几层循环中continue后面的语句。
6-30.php
<?php for ($a=1;$a<=3;$a++) { for ($b=1;$b<=3;$b++) { echo '$a:'.$a.'$b:' .$b."<br/>";//只终止内层循环 continue; //终止所在循环的本次循环,进入下一次循环 } } echo "--------------------------------------<br/>"; for ($a=1;$a<=3;$a++) { for ($b=1;$b<=3;$b++) { echo '$a:'.$a.'$b:' .$b."<br/>"; continue 2;//终止外层的本次循环,进入外循环的下一次循环 } } ?>
运行效果如图6-24所示。