php基础知识:控制结构


Posted in PHP onDecember 13, 2006

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):
   echo "a equals 5";
   echo "...";
elseif ($a == 6):
   echo "a equals 6";
   echo "!!!";
else:
   echo "a is neither 5 nor 6";
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后面可以跟一个数字来决定跳出几层循环。break 1;为跳出1层循环。
我不知道c里面有没有,因为我没有c语言的系统的书。

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

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

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

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

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

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

主要的例子就是用于Tricks(目前也只有tricks):
例如:
function profile($dump = FALSE)
{
   static $profile;
  // Return the times stored in profile, then erase it
   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) {
       echo similar_text(md5($x), md5($x*$x)), "<br />;";
   }
}
// 展示存放在概况存储区(profile)的数据
print_r(profile (TRUE));

注意:
register_tick_function() should not be used with threaded webserver modules. Ticks are not working in ZTS mode and may crash your webserver. 
不能用在多道处理模块(??不明白??什么是多道处理模块?)的服务器上,不然会crash。我crash好多次了。郁闷。

8>require和include
不同点:
include() 产生一个警告而 require() 则导致一个致命错误。换句话说,如果想在遇到丢失文件时停止处理页面就用 require()。include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的 include_path。注意在 PHP 4.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 = include 'return.php';
echo $foo; // prints 'PHP'
$bar = include 'noreturn.php';
echo $bar; // prints 1

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

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

PHP 相关文章推荐
PHP开发中常用的三个表单验证函数使用小结
Mar 03 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
php中base_convert()进制数字转换函数实例
Nov 20 PHP
Yii框架获取当前controlle和action对应id的方法
Dec 03 PHP
PHP中error_log()函数的使用方法
Jan 20 PHP
php使用mysqli向数据库添加数据的方法
Mar 20 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
Nginx环境下PHP flush失效的解决方法
Oct 19 PHP
PHP-CGI远程代码执行漏洞分析与防范
May 07 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
Laravel自动生成UUID,从建表到使用详解
Oct 24 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 PHP
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
Dec 13 #PHP
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 #PHP
傻瓜化配置PHP环境――Appserv
Dec 13 #PHP
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
Dec 13 #PHP
中篇:安装及配置PHP
Dec 13 #PHP
《PHP边学边教》(02.Apache+PHP环境配置――上篇)
Dec 13 #PHP
《PHP边学边教》(01.开篇――准备工作)
Dec 13 #PHP
You might like
php 静态页面中显示动态内容
2009/08/14 PHP
PHP文件上传原理简单分析
2011/05/29 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
Node+Express+MongoDB实现登录注册功能实例
2017/04/23 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
小程序实现选择题选择效果
2018/11/04 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
python的几种开发工具介绍
2007/03/07 Python
python备份文件的脚本
2008/08/11 Python
对于Python的框架中一些会话程序的管理
2015/04/20 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
python selenium操作cookie的实现
2020/03/18 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
大学生个人自荐信样本
2014/03/02 职场文书
2014年度考核工作总结
2014/12/24 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript