任何 PHP 脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,一个条件语句或者甚至是一个什么也不做的语句(空语句)。语句通常以分号结束。此外,还可以用花括号将一组语句封装成一个语句组。语句组本身可以当作是一行语句。一般来说,程序设计语言,都需要有支持满足程序结构化所需要的三种基本结构:顺序结构,分支结构(选择结构和条件结构)和循环结构。
目录
【8】引入外部文件(include、require、include_once、require_once)
【1】if条件结构
if(单一条件分支结构)
格式:if(表达式){语句块}
- if 结构是很多语言包括 PHP 在内最重要的特性之一,它允许按照条件执行代码片段。表达式的结果只能是布尔值,如果表达式为true,则执行语句块的内容。一条语句可以默认不写大括号,但是为了程序规范,都必须加上大括号。
- if也可以无限层的嵌套在if语句中,这给程序的不同部分的条件执行提供了充分的弹性。
$a = 9;$b = 8;
if($a > $b){//比较运算符,返回布尔值true即可执行下面的代码块
echo 'a > b','<br/>';
if($a > 8 ){//可以无限嵌套
echo $a;
}
}
-
else子句(双向条件分支结构)
经常需要在满足某个条件时执行一条语句,而在不满足该条件时执行其它语句,这正是 else 的功能。else 延伸了 if 语句,可以在 if 语句中的表达式的值为 FALSE 时执行语句。所以如果有else就一定要有对应的if
$a = 8;$b = 8;
if($a > $b){//比较结果是false 执行else
echo 'a > b';
}else{//所有if不满足的都会执行到else
echo 'a <= b';
}
-
elseif子句/else if 子句(多向条件分支结构)
elseif,和此名称暗示的一样,是 if 和 else 的组合。和 else 一样,它延伸了 if 语句,可以在原来的 if 表达式值为 FALSE 时执行不同语句。但是和 else 不一样的是,它仅在 elseif 的条件表达式值为 TRUE 时执行语句。
在同一个 if 语句中可以有多个 elseif 部分,其中第一个表达式值为 TRUE(如果有的话)的 elseif 部分将会执行。在 PHP 中,也可以写成“else if”(两个单词),它和“elseif”(一个单词)的行为完全一样。句法分析的含义有少许区别(如果你熟悉 C 语言的话,与之行为相同),但是底线是两者会产生完全一样的行为。
elseif 的语句仅在之前的 if 和所有之前 elseif 的表达式值为 FALSE,并且当前的 elseif 表达式值为 TRUE 时执行。也就是说elseif中只能由一个语句执行,它们是互相排斥的。
date_default_timezone_set('ETC/GMT-8');//设置时区,中国-东八区
$time = date('H');//时间函数 获取当前小时
if($time < 6 ){
echo 'midnight';
}elseif($time < 12){
echo 'morning';
}elseif($time < 18){
echo 'afternoon';
}else{
echo 'evening';
}
-
elseif 和 else if区别
elseif 与 else if 只有在类似上例中使用花括号的情况下才认为是完全相同。如果用冒号来定义if/elseif 条件,那就不能用两个单词的else if,否则 PHP 会产生解析错误。下面是正确用法
$a = 9;
$b = 9;
if($a > $b):
echo 'a=',$a,' b=',$b,'<br/>';
echo 'a>b';
elseif($a == $b):
echo 'a=',$a,' b=',$b,'<br/>';
echo 'a=b';
else:
echo 'a=',$a,' b=',$b,'<br/>';
echo 'a<b';
endif;
- 优化if,elseif,将可能性比较大放在前面,这样会减少if else的判断。如果是固定的几个值的话,可以使用switch语句比较快。
【2】switch条件语句
switch 语句类似于具有同一个表达式的一系列 if 语句。很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。这正是 switch 语句的用途。
switch(exp) #使用switch关键字,对小括号中的表达式求值 会对应跳到case里面
{ #switch开始。必须使用大括号,把下面给包含进来
case 值1: #如果表达式的值对应case的值1,则执行下面的语句块1
语句块1; #匹配成功值后,执行语句块,可以是多条语句
break; #然后退出switch,如果不退出会继续向下执行。
case 值2:
语句块2;
break;
... #case也是没有限制
case 值n:
语句块n;
break;
default: #如果上面任何一个case后的值都不匹配则执行默认语句,可以不写
语句块n+1 #执行后,自动跳出switch语句
} #switch结束
- 来简单实践一下 ,case中的代码块可以多行。
$now = date("w");#获取当前星期,用数字表示,0表示周日,
switch($now){#这里now是匹配的整型
case 0:
echo 'Sunday! ';
echo 'I am very Happy!';
break;
case 6:
echo 'Saturday! ';
echo 'I am very exciting!';
break;
default:
echo 'Working Working Working!!! ';
echo 'It is so busy!';
}
-
还可以直接匹配字符串。
-
switch语句中匹配完成后,会执行case语句,直至switch语句结束,或者遇见break。如果一个语句没有写break,则程序继续执行下一条分支语句的内容。也就是说它可以匹配多个条件执行同一个语句块。
$now = date("l");#获取当前星期几,返回英文的星期几
switch($now){#这里直接匹配的字符串
case 'Sunday':
case 'Saturday':
echo 'Weekend!';#不论周六还是周日,都是周末
echo 'I am very exciting!';
break;
default:#其他的值都是,正常工作日
echo 'Working Working Working!!! ';
echo 'It is so busy!';
}
- 原理:switch语句执行,首先只计算一次小括号里面的表达式的值(if elseif语句中会再次求值),然后与下面的case从上向下进行匹配,如果你写两个一样case的值,那么会匹配前面一个。另外再次强调一下,他是松散匹配,类型可能不是完全匹配。 switch会生成跳转表,会直接跳转到对应的case,比较快。
$a=9;
switch($a){
case '9'://直接就调转到这个地方,松散比较
echo 'string1';
break;
case '9':
echo 'string2';
break;
case 9:
echo 'int';
break;
}
-
switch中的break、continue 、break num 、continue num
默认关键词后面不加num,也就是默认num是1。这个num默认是正数表示,要跳出的外循环层数。
注意在 PHP 中switch语句被认为是可以使用 continue 的一种循环结构。
注意和其它语言不同,continue作用到 switch 上的作用类似于 break。如果在循环中有一个 switch 并希望 continue 到外层循环中的下一轮循环,用 continue 2。
break跳出代码片段,结束这个循环
continue结束当前片段,结束这次循环,继续下一次循环
switch(9){
case 9:
echo 9;
continue;//在switch中相当于break,后面都不会执行,直接跳出
echo 10;
break;
echo 11;
default:
echo 'equal nine';
}
for($i=0;$i<9;$i++){
switch($i){
case 1:
echo $i.'=1','<br/>';
//break ;//跳出本次switch,还是循环9次
//continue ;//跳出switch continue,还是循环9次
break 2;//跳出外部循环,跳出1层到外层循环中
//continue 2;//跳出外部循环中的下一轮循环 还是循环9次
//break 3;//报错,没有3层循环
// continue 3;//报错 没有3层循环
default:
echo 'equal nine',$i,'<br/>';
}
}
【3】while/do while(条件型循环结构)
while和do while会用于在不明确循环次数的,但是知道循环的终止条件的场景。
-
while 循环
PHP 中最简单的循环类型。它和 C 语言中的 while 表现地一样。
while 语句的含意很简单,它告诉 PHP 只要 while 表达式的值为 TRUE 就重复执行嵌套中的循环语句。表达式的值在每次开始循环时检查,所以即使这个值在循环语句中改变了,语句也不会停止执行,直到本次循环结束。有时候如果 while 表达式的值一开始就是 FALSE,则循环语句一次都不会执行。
$num = 0;
while($num < 9){//循环9次,当num=9的时候,while循环条件false,结束循环
++$num;
echo $num;//123456789
}
-
do-while 循环
do-while 循环和 while 循环非常相似,区别在于表达式的值是在每次循环结束时检查而不是开始时。和一般的 while 循环主要的区别是 do-while 的循环语句保证会执行一次(表达式的真值在每次循环结束后检查),然而在一般的 while 循环中就不一定了(表达式真值在循环开始时检查,如果一开始就为 FALSE 则整个循环立即终止)。
$i = 0;
do {
echo $i;//至少执行一次
} while ($i > 0);//然后判断false,直接结束
【4】for和foreach循环
-
for语句将循环次数的变量事先定义好,常常用于计数方式控制循环。
语法格式:
for(初始化 ; 条件表达式 ; 增量){
语句块;//这里就是循环体
}
初始化:在循环开始前执行一次
条件表达式:每次循环开始前求值,如果true就继续循环,如果false就终止循环。
增量:每次循环后计算执行
这三个地方都都可以为空,或者包括逗号分隔开的表达式。第二个地方所有用逗号分隔开的表达式,都会计算,但是只取最后一个结果。第二个方法,如果为空,则会无限制循环下去,但是可以在循环体中定义循环结束条件。
-
常规for循环
//一般的for循环
for ($i = 1; $i <= 10; $i++) {
echo $i;#输出12345678910
}
- 利用break来控制循环终止条件
for ($i = 1; ; $i++) {
if ($i > 10) {
break;//可以通过break进行控制循环终止条件
}
echo $i;#输出12345678910
}
- 小括号省略不写(但是分号一定要写)
$i = 1;//把初始化条件放在外面
for (;;) {
if ($i > 10) {//终止循环体条件
break;
}
echo $i;#输出12345678910
$i++;//把循环增量放在循环体也可以
}
- 全部放在小括号,循环体就是小括号的内容
for ($i = 1, $sum = 0; $i <= 10; $sum += $i, print $i,print '+', $i++);
echo '0=' ,$sum;//为什么小括号里面不用echo,那是因为逗号原因,会报错。
//最后输出1+2+3+4+5+6+7+8+9+10+0=55
//可以看到for后面用了分号 也就是没有那种大括号循环体,但是也会循环进行小括号里面的内容
- 实例
$arr = ['a','b','c','d','e','f','g'];
for($i=0;$i<count($arr);++$i){//这里由于每次都要执行判断条件,所以每次都要调用count函数,不太好
echo $arr[$i];
}
#简单优化一下
$len = count($arr);//先用函数把长度拿出来
for($i=0;$i<$arr;++$i){
echo $arr[$i];
}
-
foreach
foreach语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。
foreach($array as $value){}
foreach($array as $key=>$value){}
第一种:遍历给定的$array数组,每次循环中,当前单元的值赋值给$value,并且数组内部的指针向前移动一步
第二种:做同样的工作,同时把当前单元的键名也会在每次循环中被赋给变量 $key
- 当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()。而在while循环中,默认不会reset。
$arr = ['name'=>'tacks','age'=>20,'country'=>'NanYang'];
foreach($arr as $k=>$v){
echo $k,'=>',$v,'<br/>';
}
echo $v;//最后一个值仍然会保留
echo '<hr>';
- 利用list()和each()以及while循环实现数组遍历
reset($arr);//把数组的指针重置到开始
while (list($key, $value) = each($arr)) {//list与each组合 索引关联
echo "Key: $key; Value: $value<br />";
}
【5】declare
declare 结构用来设定一段代码的执行指令。declare 的语法和其它流程控制结构相似。declare 结构也可用于全局范围,影响到其后的所有代码(但如果有 declare 结构的文件被其它文件包含,则对包含它的父文件不起作用)。
Tick(时钟周期)是一个在 declare 代码段中解释器每执行 N 条可计时的低级语句就会发生的事件。N 的值是在 declare 中的 directive 部分用ticks=N
来指定的。不是所有语句都可计时。通常条件表达式和参数表达式都不可计时。每个tick中出现的事件是由register_tick_function()函数指定的。有些不好理解,举个例子吧。
declare(ticks=1);//每执行 1 条可计时的低级语句就会发生的事件check_timeout
// 开始时间
$time_start = time();
// 检查是否已经超时
function check_timeout(){
global $time_start;// 开始时间
$timeout = 5;// 开始时间
if(time()-$time_start > $timeout){
exit("overtime {$timeout}s exit!!!");
}
}
// Zend引擎每执行一次低级语句就执行一下check_timeout
register_tick_function('check_timeout'); //指定函数
// 模拟一段耗时的业务逻辑
while(1){
$num = 1;
}
【6】return
-
如果在一个函数中调用 return 语句,将立即结束此函数的执行并将它的参数作为函数的值返回。return 也会终止 eval() 语句或者脚本文件的执行。
function foo(){
return 100;//作为函数的返回值
echo 99;//本行不会执行
}
var_dump(foo());//调用函数,并且打印返回值100
-
注意既然 return 是语言结构而不是函数,因此其参数没有必要用括号将其括起来。通常都不用括号,实际上也应该不用,这样可以降低 PHP 的负担。
function foo(){
return ('true');//实际上不需要加括号
}
var_dump(foo());//string 'true' (length=4)
-
如果没有提供参数,则一定不能用括号,此时返回 NULL。如果调用 return 时加上了括号却又没有参数会导致解析错误。
function foo(){
return;
}
var_dump(foo());//null
【7】goto
goto 操作符可以用来跳转到程序中的另一位置。该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。PHP5.3以上的版本可以。
goto a;//跳转到另一个a:的位置
echo 'Foo';//掠过不执行
a://直接调转到这里
echo 'Bar';//向下执行
PHP 中的 goto 有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数。也无法跳入到任何循环或者 switch 结构中。可以跳出循环或者 switch,通常的用法是用 goto 代替多层的 break。
for($i=0,$j=10;$i<10;$i++){
while($j--){
if($j==9){
goto end;//跳出循环
}
}
}
echo 'OK';
end://蹦到这里
echo $i,$j;//09
【8】引入外部文件(include、require、include_once、require_once)
详情可以看下面这篇