PHP学习之流程控制

一、注意

必须要注意的是 elseif 与 else if 只有在类似下面例子中使用花括号的情况下才认为是完全相同。如果用冒号来定义 if/elseif 条件,那就不能用两个单词的 else if,否则 PHP 会产生解析错误。



二、流程控制的替代语法

PHP中流程控制的替代语法是:包括 ifwhileforforeach 和 switch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;endwhile;endfor;endforeach; 以及 endswitch;

HTML 内容“A is equal to 5”用替代语法嵌套在 if 语句中。该 HTML 的内容仅在$a等于 5 时显示。

注意:不支持在同一个控制块内混合使用两种语法

注意:switch 和第一个 case 之间的任何输出(含空格)将导致语法错误。例如,这样是无效的:


而这样是有效的,因为 switch 之后的换行符被认为是结束标记 ?> 的一部分,所以在 switch 和 case 之间不能有任何输出:

(while语句)while 语句的含意很简单,它告诉 PHP 只要 while 表达式的值为 TRUE 就重复执行嵌套中的循环语句。表达式的值在每次开始循环时检查,所以即使这个值在循环语句中改变了,语句也不会停止执行,直到本次循环结束。有时候如果while 表达式的值一开始就是 FALSE,则循环语句一次都不会执行。


(do-while循环)do-while 和 while 非常相似,区别在于表达式的值是在每次循环结束时检查而不是开始时。和一般的 while循环主要的区别是 do-while 的循环语句保证会执行一次(表达式的真值在每次循环结束后检查),然而在一般的while 循环中就不一定了(表达式真值在循环开始时检查,如果一开始就为FALSE则整个循环立即终止)。
另一种do-while循环用法:把语句放在 do-while(0) 之中,在循环内部用break语句来结束执行循环。以下代码片段示范了此方法:

(for语句)

PHP 也支持用冒号的 for 循环的替代语法。

for (expr1; expr2; expr3):
    statement;
    ...
endfor;
(foreach):foreach 语法结构提供了遍历数组的简单方式。foreach 仅能用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。有两种语法:
foreach (array_expression as $value)
    statement
第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。
foreach (array_expression as $key => $value)
    statement
第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key

注意:当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()由于 foreach 依赖内部数组指针,在循环中修改其值将可能导致意外的行为。

注意:$value 的引用仅在被遍历的数组可以被引用时才可用(例如是个变量)。以下代码则无法运行:

注意:数组环之最后一个元素的 $value 引用在 foreach 循后仍会保留。建议使用 unset() 来将其销毁。
注意:foreach 不支持用“@”来抑制错误信息的能力。

补充:reset() 函数将内部指针指向数组中的第一个元素,并输出。

相关的方法:

  • current() - 返回数组中的当前元素的值。
  • end() - 将内部指针指向数组中的最后一个元素,并输出。
  • next() - 将内部指针指向数组中的下一个元素,并输出。
  • prev() - 将内部指针指向数组中的上一个元素,并输出。
  • each() - 返回当前元素的键名和键值,并将内部指针向前移动。




(用list()给嵌套的数组解包)PHP 5.5 增添了遍历一个数组的数组的功能并且把嵌套的数组解包到循环变量中,只需将 list() 作为值提供。

list() 中的单元可以少于嵌套数组的,此时多出来的数组单元将被忽略

输出结果为:

如果 list() 中列出的单元多于嵌套数组则会发出一条消息级别的错误信息

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

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


(continue):continue 在循环结构中用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环。continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。默认值是 1,即跳到当前循环末尾。注意在 PHP 中 switch 语句被认为是可以使用 continue 的一种循环结构。

(switch语句) 注意和其它语言不同,continue 语句作用到 switch 上的作用类似于 break。如果在循环中有一个 switch 并希望 continue 到外层循环中的下一轮循环,用 continue 2


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


这里如果 $i 等于 0,PHP 将执行所有的 echo 语句!如果 $i 等于 1,PHP 将执行后面两条 echo 语句。只有当$i 等于 2 时,才会得到“预期”的结果——只显示“i equals 2”。所以,别忘了 break 语句就很重要(即使在某些情况下故意想避免提供它们时)。

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


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


case 表达式可以是任何求值为简单类型的表达式即整型或浮点数以及字符串。不能用数组或对象,除非它们被解除引用成为简单类型switch 支持替代语法的流程控制。


允许使用分号代替 case 语句后的冒号:


(declare)

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

declare (directive)
    statement

directive 部分允许设定 declare 代码段的行为。目前只认识两个指令:ticks以及encodingdeclare 代码段中的 statement 部分将被执行——怎样执行以及执行中有什么副作用出现取决于 directive 中设定的指令。declare 结构也可用于全局范围,影响到其后的所有代码(但如果有 declare 结构的文件被其它文件包含,则对包含它的父文件不起作用)。

Tick(时钟周期)是一个在 declare 代码段中解释器每执行 N 条可计时的低级语句就会发生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 来指定的。不是所有语句都可计时。通常条件表达式和参数表达式都不可计时。




declare 调试内部程序使用.
先简单说明,declare这个函数只支持一个参数就是ticks,函数表示记录程序块,需配合register_tick_function 函数使用。ticks参数表示运行多少语句调用一次register_tick_function的函数。并且declare支持两种写法:
1. declare(ticks = 1); 整个脚本
2. declare(ticks = 1) { 内部的代码做记录

}

上述代码除了 函数体内,外部都会被执行,运行可以看执行次数和时间. 他更适合做测试代码段中每一部分的执行时间 和执行次数. 
declare 必须是全局的,放在程序外部.
tick 代表一个事件,事件的定义是在register_tick_function;事件的执行频率是在(ticks=3)。
表示事件频率是执行3个才记录一次. microtime() 是打印时间.

一般用法是 declare(ticks=N);
拿declare(ticks=1)来说,这句主要作用有两种:
1、Zend引擎每执行1条低级语句就去执行一次 register_tick_function() 注册的函数
可以粗略的理解为每执行一句php代码(例如:$num=1;)就去执行下已经注册的tick函数。
一个用途就是控制某段代码执行时间,例如下面的代码虽然最后有个死循环,但是执行时间不会超过5秒。

运行 php timeout.php


可以用 encoding 指令来对每段脚本指定其编码方式。


注意:当和命名空间结合起来时 declare 的唯一合法语法是 declare(encoding='...');,其中 ... 是编码的值。而 declare(encoding='...') {} 将在与命名空间结合时产生解析错误。

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

Note如果没有提供参数,则一定不能用括号,此时返回 NULL。如果调用 return 时加上了括号却又没有参数会导致解析错误。Note当用引用返回值时永远不要使用括号,这样行不通。只能通过引用返回变量,而不是语句的结果。如果使用return ($a); 时其实不是返回一个变量,而是表达式 ($a) 的值(当然,此时该值也正是 $a 的值)。

(require)require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行。

猜你喜欢

转载自blog.csdn.net/mx_studying/article/details/80908703