码迷,mamicode.com
首页 > 其他好文 > 详细

流程控制

时间:2018-01-15 20:34:12      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:结束   浮点数   dir   指针   不能   enable   魔术   默认值   流程   

elseif/else if

在PHP中,也可以写成“else if”(两个单词),它和“elseif”(一个单词)的行为完全一样。句法分析的含义有少许区别,但是底线是两者会产生完全一样的行为。

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

流程控制的替代语法

PHP提供了一些流程控制的替代语法,包括if,while,for,foreach和switch。替代语法的基本形式是把左花括号换成冒号,把右花括号分别换成endif;,endwhile;,endfor;,endforeach;以及endswitch;。

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

Warning:switch和第一个case之间的任何输出(含空格)将导致语法错误。

foreach

foreach仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。

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

$value的引用仅在被遍历的数组可以被引用时才可用。

Warning:数组最后 一个元素的$value引用在foreach循环之后仍会保留。建议使用unset()来将其销毁。

Note:foreach不支持用“@”来抑制错误信息的能力。

用list()给嵌套的数组解包

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

list()中的单元可以少于嵌套数组的,此时多出来的数组单元将被忽略。如果list()中列出的单元多于嵌套数组则会发出一条消息级别的错误信息。

break

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

PHP5.4.0  break0;不再合法。这在之前的版本被解析为break1;取消变量作为参数传递。

continue

Note:注意在PHP中switch语句被认为是可以使用continue的一种循环结构。

continue接受一个可选的数字参数来决定跳过几重循环到循环结尾。默认值是1,即跳到当前循环末尾。

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

5.4.0  continue 0;不再合法。这在之前的版本被解析为continue 1;取消变量作为参数传递。

switch

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

Note:注意switch/case作的是松散比较。

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

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

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

 declare

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

declare(directive) statement

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

Note:encoding是PHP5.3.0新增指令。

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

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

Ticks

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

不是所有语句都可计时。通常条件表达式和参数表达式都不可计时。

在每个tick中出现的事件是由register_tick_function()来指定的。注意每个tick中可以出现多个事件。

Encoding

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

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

在PHP5.3中除非在编译时指定了--enable-zend-multibyte,否则declare中的encoding值会被忽略。

注意除非用phpinfo(),否则PHP不会显示出是否在编译时指定了--enable-zend-multibyte。

 return

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

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

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

Note:如果没有提供参数,则一定不能用括号,此时返回NULL。如果调用return时加上了括号却又没有参数会导致解析错误。

Note:当用引用返回值时永远不要使用括号,这样行不通。只能通过引用返回变量,而不是语句的结果。如果使用return($a);时其实不是返回一个变量,而是表达式($a)的值(当然,此时该值也正是$a的值)。

require

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

include

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

被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照include_path指定的目录寻找。如果在include_path下没找到该文件则include最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则include结构会发出一条警告;这一点和require不同,后者会发出一个致命错误。

如果定义了路径--不管是绝对路径还是当前目录的相对路径--include_path都会被完全忽略。

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

如果include出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。此规则的一个例外是魔术常量,它们是在发生包含之前就已被解析器处理的。

当一个文件被包含时,语法解析器在目标文件的开头脱离PHP模式并进入HTML模式,到文件结尾处恢复。由于此原因,目标文件中需要作为PHP代码执行的任何代码都必须被包括在有效的PHP起始和结束标记之中。

如果“URL fopen wrappers”在PHP中被激活(默认配置),可以用URL而不是本地文件来指定要被包含的文件。如果目标服务器将目标文件作为PHP代码解释,则可以用适用于HTTP GET的URL请求字符串来向被包括的文件传递变量。严格的说这和包含一个文件并继承父文件的变量空间并不是一回事;该脚本文件实际上已经在远程服务器上运行了而本地脚本则包括了其结果。

Warning: Windows版本的PHP在4.3.0版之前不支持通过此函数访问远程文件,即使已经启用allow_url_fopen。

Warning:远程文件可能会经远程服务器处理(根据文件后缀以及远程服务器是否在运行PHP而定),但必须产生一个合法的PHP脚本,因为其将被本地服务器处理。如果来自远程服务器的文件应该在远端运行而只输出结果,那用readfile()函数更好。另外还要格外小心以确保远程的脚本产生出合法并且是所需的代码。

处理返回值:在失败时include返回FALSE并且发出警告。成功的包含则返回1,除非在包含文件中另外给出了返回值。可以在被包括的文件中使用return语句来终止该文件中程序的执行并返回调用它的脚本。同样也可以从被包含的文件中返回值。可以像普通函数一样获得include调用的返回值。不过这在包含远程文件时却不行,除非远程文件的输出具有合法的PHP开始和结束标记(如同任何本地文件一样)。可以在标记内定义所需的变量,该变量在文件被包含的文职之后就可用了。

因为include是一个特殊的语言结构,其参数不需要括号。在比较其返回值时要注意。

如果在包含文件中定义有函数,这些函数不管是在return之前还是之后定义的,都可以独立在主文件中使用。如果文件被包含两次,PHP5发出致命错误因为函数已经被定义,但是PHP4不会对在return之后定义的函数报错。推荐使用include_once而不是检查文件是否已包含并在包含文件中有条件返回。

另一个将PHP文件“包含”到一个变量中的方法是用输出控制函数结合include来捕获其输出。

Note:因为是一个语言构造器而不是一个函数,不能被可变函数调用。

include_once可以用于在脚本执行期间同一个文件有可能被包含超过一次的的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。

goto

PHP中的goto有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数。也无法跳入到任何循环或者switch结构中。可以跳出循环或者switch,通常的用法是用goto代替多层的break。

Note:goto操作符仅在PHP5.3及以上版本有效。

 

流程控制

标签:结束   浮点数   dir   指针   不能   enable   魔术   默认值   流程   

原文地址:https://www.cnblogs.com/apricot92/p/8243957.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!