PHP基础知识点【六】流程控制

任何 PHP 脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,一个条件语句或者甚至是一个什么也不做的语句(空语句)。语句通常以分号结束。此外,还可以用花括号将一组语句封装成一个语句组。语句组本身可以当作是一行语句。一般来说,程序设计语言,都需要有支持满足程序结构化所需要的三种基本结构:顺序结构,分支结构(选择结构和条件结构)和循环结构。

目录

【1】if条件结构

if(单一条件分支结构)

else子句(双向条件分支结构)

elseif子句/else if 子句(多向条件分支结构)

【2】switch条件语句

【3】while/do while(条件型循环结构)

while 循环

do-while 循环

【4】for和foreach循环

常规for循环

foreach

【5】declare

【6】return

【7】goto

【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,和此名称暗示的一样,是 ifelse 的组合。和 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中的breakcontinue 、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)

详情可以看下面这篇

https://blog.csdn.net/Tacks/article/details/86480586

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值