·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> php网站开发 >> PHP学习心得(十)——控制结构

PHP学习心得(十)——控制结构

作者:佚名      php网站开发编辑:admin      更新时间:2022-07-23
php学习心得(十)——控制结构 Posted on 2014-04-10 14:18 菜鸟展翅 阅读(...) 评论(...) 编辑 收藏

if结构是很多语言包括 PHP 在内最重要的特性之一,它允许按照条件执行代码片段。

if语句可以无限层地嵌套在其它if语句中,这给程序的不同部分的条件执行提供了充分的弹性。

else延伸了if语句,可以在if语句中的表达式的值为FALSE时执行语句。

elseif,在elseif的条件表达式值为TRUE时执行语句。

在同一个if结构中可以有多个elseif语句。第一个表达式值为TRUEelseif语句(如果有的话)将会执行。在 PHP 中,也可以写成“else if”(两个单词),它和“elseif”(一个单词)的行为完全一样。句法分析的含义有少许区别(如果你熟悉 C 语言的话,这是同样的行为),但是底线是两者会产生完全一样的行为。

Note:必须要注意的是elseifelse if只有在类似上例中使用大括号的情况下才认为是完全相同

PHP 提供了一些流程控制的替代语法,包括ifwhileforforeachswitch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成endif;endwhile;endfor;endforeach;以及endswitch;。替代语法同样可以用在elseelseif中。

while循环是 PHP 中最简单的循环类型。

if语句一样,可以在while循环中用花括号括起一个语句组,或者用替代语法。

do-whilewhile循环非常相似,区别在于表达式的值是在每次循环结束时检查而不是开始时。

for循环是 PHP 中最复杂的循环结构。

每个表达式都可以为空或包括逗号分隔的多个表达式。

PHP 4 引入了foreach结构,是一种遍历数组简便方法。foreach仅能用于数组。有两种语法,第二种比较次要但却是第一种的有用的扩展。

foreach (array_exPRession as $value)    statementforeach (array_expression as $key => $value)    statement

第一种格式遍历给定的array_expression数组。每次循环中,当前单元的值被赋给$value并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量$key

自PHP 5 起,还可能遍历对象。

Note:当foreach开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在foreach循环之前调用reset()。

自 PHP 5 起,可以很容易地通过在$value之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。

 <?php$arr = array(1, 2, 3, 4);foreach ($arr as &$value) {    $value = $value * 2;}// $arr is now array(2, 4, 6, 8)?> 

  

break结束当前forforeachwhiledo-while或者switch结构的执行。

break可以接受一个可选的数字参数来决定跳出几重循环。

<?php$arr = array('one', 'two', 'three', 'four', 'stop', 'five');while (list (, $val) = each($arr)) {    if ($val == 'stop') {        break;    /* You could also write 'break 1;' here. */    }    echo "$val<br /> ";}/* 使用可选参数 */$i = 0;while (++$i) {    switch ($i) {    case 5:        echo "At 5<br /> ";        break 1;  /* 只退出 switch. */    case 10:        echo "At 10; quitting<br /> ";        break 2;  /* 退出 switch 和 while 循环 */    default:        break;    }}?>

continue在循环结构用用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环

continue接受一个可选的数字参数来决定跳过几重循环到循环结尾。

 1 <?php 2 while (list ($key, $value) = each($arr)) { 3     if (!($key % 2)) { // skip odd members 4         continue; 5     } 6     do_something_odd($value); 7 } 8  9 $i = 0;10 while ($i++ < 5) {11     echo "Outer<br /> ";12     while (1) {13         echo "&nbsp;&nbsp;Middle<br /> ";14         while (1) {15             echo "&nbsp;&nbsp;Inner<br /> ";16             continue 3;17         }18         echo "This never gets output.<br /> ";19     }20     echo "Neither does this.<br /> ";21 }22 ?>

省略continue后面的分号会导致混淆。

switch语句和具有同样表达式的一系列的 IF 语句相似,即把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。

Note:continue语句作用到 switch 上的作用类似于break。如果在循环中有一个 switch 并希望 continue 到外层循环中的下一个轮回,用continue 2

理解switch是怎样执行的非常重要。switch语句一行接一行地执行(实际上是语句接语句)。开始时没有代码被执行。仅当一个case语句中的值和switch表达式的值匹配时 PHP 才开始执行语句,直到switch的程序段结束或者遇到第一个break语句为止。如果不在 case 的语句段最后写上break的话,PHP 将继续执行下一个 case 中的语句段。

switch语句中条件只求值一次并用来和每个case语句比较。在elseif语句中条件会再次求值。如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用switch语句可能会快一些。

在一个 case 中的语句也可以为空,这样只不过将控制转移到了下一个 case 中的语句。

<?phpswitch ($i) {    case 0:    case 1:    case 2:        echo "i is less than 3 but not negative";        break;    case 3:        echo "i is 3";}?>

一个 case 的特例是default。它匹配了任何和其它 case 都不匹配的情况。

case表达式可以是任何求值为简单类型的表达式,即整型或浮点数以及字符串。不能用数组或对象,除非它们被解除引用成为简单类型。

switch支持替代语法的流程控制。

允许使用分号(;)代替case语句后的冒号(:),

declare结构用来设定一段代码的执行指令。declare的语法和其它流程控制结构相似:

declare (directive)    statement

directive部分允许设定declare代码段的行为。目前只认识两个指令:ticks指令以及encoding指令。

Note:encoding 是 PHP 5.3.0 新增指令。

declare代码段中的statement部分将被执行——怎样执行以及执行中有什么副作用出现取决于directive中设定的指令。

declare结构也可用于全局范围,影响到其后的所有代码(但如果有declare结构的文件被其它文件包含,它对包含它的文件不起作用)。

<?php// you can use this:declare(ticks=1) {    // entire script here}// or you can use this:declare(ticks=1);// entire script here?>

Ticks

ticks 指令在 PHP 5.3.0 中是过时指令,将会从 PHP 6.0.0 移除。

Tick 是一个在declare代码段中解释器每执行N条低级语句就会发生的事件。N的值是在declare中的directive部分用ticks=N来指定的。

在每个 tick 中出现的事件是由register_tick_function()来指定的。

Ticks 很适合用来做调试,以及实现简单的多任务,后台 I/O 和很多其它任务。

在一个函数中调用return()语句,将立即结束此函数的执行并将它的参数作为函数的值返回。return()也会终止eval()语句或者脚本文件的执行。

如果在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被include()的或者require()的,则控制交回调用文件。此外,如果当前脚本是被include()的,则return()的值会被当作include()调用的返回值。如果在主脚本文件中调用return(),则脚本中止运行。如果当前脚本文件是在php.ini中的配置选项 auto_prepend_file 或者 auto_append_file 所指定的,则此脚本文件中止运行。

Note:注意既然return()是语言结构而不是函数,因此其参数没有必要用括号将其括起来。通常都不用括号,实际上也应该不用,这样可以降低 PHP 的负担。

require()语句包含并运行指定文件,详见include()文档。

require()和include()几乎完全一样,除了处理失败的方式不同之外。include()产生一个Warning而require()则导致一个 Fatal Error。换句话说,如果想在丢失文件时停止处理页面,那就别犹豫了,用require()吧。include()就不是这样,脚本会继续运行。同时也要确认设置了合适的include_path。

1 <?php2 3 require 'prepend.php';4 5 require $somefile;6 7 require ('somefile.txt');8 9 ?>

include()语句包含并运行指定文件。

以下文档也适用于require()。这两种结构除了在如何处理失败之外完全一样。include()产生一个警告而require()则导致一个致命错误。换句话说,如果想在遇到丢失文件时停止处理页面就用require()。include()就不是这样,脚本会继续运行。同时也要确认设置了合适的 include_path。

当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。

 1 vars.php 2 <?php 3  4 $color = 'green'; 5 $fruit = 'apple'; 6  7 ?> 8  9 test.php10 <?php11 12 echo "A $color $fruit"; // A13 14 include 'vars.php';15 16 echo "A $colo