php基础知识:控制结构

2018-09-07 13:44

阅读:239

  php的控制结构,大部分和其他主流语言,如C,Java等相同。

这里列出一些不同的以及经常被考到的细节:

1>流程控制的替代语法(pascal的风格)
主要用在if,while,for,foreach和switch语句中。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成endif;,endwhile;,endfor;,endforeach;以及endswitch;。
例(1):
if($a==5):
/*dosomething1*/
/*dosomething1*/
endif;
就等同于:
if($a==5){
/*dosomething1*/
/*dosomething1*/
}
例(2):
if($a==5):
echoaequals5;
echo...;
elseif($a==6):
echoaequals6;
echo!!!;
else:
echoaisneither5nor6;
endif;

2>for语句(经常考,并且彻底的明白也是必要的).
格式:(支持`:`……`endfor;`代替{}的形式)
for(expr1;expr2;expr3)
statement
运行过程:
第一个表达式(expr1)在循环开始前无条件求值一次。
expr2在每次循环开始前求值。如果值为TRUE,则继续循环,执行嵌套的循环语句。如果值为FALSE,则终止循环。
expr3在每次循环之后被求值(执行)。
等同的while语句为:
expr1;
while(expr2):
expr3;
endwhile;

3>break的不同。
break的作用是:结束当前for,foreach,while,do-while或者switch结构的执行。
同时break后面可以跟一个数字来决定跳出几层循环。break1;为跳出1层循环。
我不知道c里面有没有,因为我没有c语言的系统的书。

4>foreach
格式:
a.foreach(array_expressionas$value)
statement
b.foreach(array_expressionas$key=>$value)
statement
说明:
a格式遍历给定的array_expression数组。每次循环中,当前单元的值被赋给$value并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。
b格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量$key。

注意:
a.当foreach开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在foreach循环之前调用reset()。/*reset(array&array):把array的内部指针移动到数组array的第一个单元并返回值*/
b.除非数组是被引用,foreach所操作的是指定数组的一个拷贝,而不是该数组本身。因此数组指针不会被each()结构改变,对返回的数组单元的修改也不会影响原数组。不过原数组的内部指针的确在处理数组的过程中向前移动了。假定foreach循环运行到结束,原数组的内部指针将指向数组的结尾。
自PHP5起,可以很容易地通过在$value之前加上&来修改数组的单元。此方法将以引用赋值而不是拷贝一个值。
例:
$arr=array(1,2,3,4);
foreach($arras&$value){
$value=$value*2;
}
//$arrisnowarray(2,4,6,8)
c.foreach不支持用“@”来抑制错误信息的能力。

使用foreach例子:
$arr=array(one,two,three);
reset($arr);
while(list(,$value)=each($arr)){
echoValue:$value<br>\n;
}
foreach($arras$value){
echoValue:$value<br/>\n;
}

5>continue的不同(我很少用continue)
作用:在循环结构用用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环。
同break一样,也接受一个数字来决定跳出几层到循环代码尾部。
注明:continue;和continue1;一样,都是跳到本层本次循环的末尾。continue2则跳出本层循环到外层的末尾。

6>switch中continue的作用:类似于break(和其他语言不同)。

7>declare
结构用来设定一段代码的执行指令。declare的语法和其它流程控制结构相似:
declare(directive)
statement
directive部分允许设定declare代码段的行为。目前只认识一个指令:ticks(更多信息见下面ticks指令)。
declare代码段中的statement部分将被执行怎样执行以及执行中有什么副作用出现取决于directive中设定的指令。
declare结构也可用于全局范围,影响到其后的所有代码。

主要的例子就是用于Tricks(目前也只有tricks):
例如:
functionprofile($dump=FALSE)
{
static$profile;
//Returnthetimesstoredinprofile,theneraseit
if($dump){
$temp=$profile;
unset($profile);
return($temp);
}
$profile[]=microtime();
}
//注册函数profile为ticks函数
register_tick_function(profile);
//初始化。
profile();
//运行一块代码,当执行2句(ticks=2)简单语句时,就调用一次函数profile();
declare(ticks=2){
for($x=1;$x<50;++$x){
echosimilar_text(md5($x),md5($x*$x)),<br/>;;
}
}
//展示存放在概况存储区(profile)的数据
print_r(profile(TRUE));

注意:
register_tick_function()shouldnotbeusedwiththreadedwebservermodules.TicksarenotworkinginZTSmodeandmaycrashyourwebserver.
不能用在多道处理模块(??不明白??什么是多道处理模块?)的服务器上,不然会crash。我crash好多次了。郁闷。

8>require和include
不同点:
include()产生一个警告而require()则导致一个致命错误。换句话说,如果想在遇到丢失文件时停止处理页面就用require()。include()就不是这样,脚本会继续运行。同时也要确认设置了合适的include_path。注意在PHP4.3.5之前,包含文件中的语法错误不会导致程序停止,但从此版本之后会。

相同点以及用法:
a.变量范围:
当一个文件被包含时,其中所包含的代码继承了包含语句所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。
如果包含语句出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。

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

c.在条件语句中的格式问题
因为include()和require()是特殊的语言结构,在条件语句中使用必须将其放在语句组中(花括号中)。
因为include()是一个特殊的语言结构,其参数不需要括号。在比较其返回值时要注意。

d.处理返回值
可以在被包括的文件中使用return()语句来终止该文件中程序的执行并返回调用它的脚本。同样也可以从被包含的文件中返回值。可以像普通函数一样获得include调用的返回值。不过这在包含远程文件时却不行,除非远程文件的输出具有合法的PHP开始和结束标记(如同任何本地文件一样)。可以在标记内定义所需的变量,该变量在文件被包含的位置之后就可用了。
例子:
return.php
==============
$var=PHP;
return$var;

noreturn.php
==============
$var=PHP;

testreturns.php
=============================
$foo=includereturn.php;
echo$foo;//printsPHP
$bar=includenoreturn.php;
echo$bar;//prints1

e.函数和变量重定义的问题.
为了防止这种现象出现,可以使用include_once或者require_once

f.其它:
在PHP4.0.2之前适用以下规则:require()总是会尝试读取目标文件,即使它所在的行根本就不会执行。条件语句不会影响require()。不过如果require()所在的行没有执行,则目标文件中的代码也不会执行。同样,循环结构也不影响require()的行为。尽管目标文件中包含的代码仍然是循环的主体,但require()本身只会运行一次


评论


亲,登录后才可以留言!