PHP基础入门(二)

[!NOTE]

本篇文章仅用于个人交流与学习,如涉及侵权请联系站长删除!

​ 这篇文章用来理解PHP流程控制语句、函数和数组!

1. 流程控制语句

​ 流程控制语句用来控制程序的执行流程,分为三种流程结构:

顺序结构、选择结构和循环结构。

1.1 顺序结构

​ 当没有任何有关流程控制的语句时,程序默认的执行顺序,从上而下,一行一行执行。

1.2 选择结构

​ 程序在自上而下依次执行时,可以通过条件判断,选择性的执行某一段代码。若条件P为真,则执行A,否则执行B 。

1.2.1 if语句

1
2
3
4
5
6
7
if(condition1){
//code1
}elseif(condition2){
//code2
}else{
//code3
}
  • 解释:上面的代码若condition1条件为真,则执行code1部分的代码;若condition1不为真但condition2为真,则执行code2部分的代码,若两者都不为真,则执行code3部分的代码。

1.2.2 switch语句

1
2
3
4
5
6
7
8
9
10
switch($var){
case value1:
//code
break;
case value2:
//code
break;
default:
//code
}
  • 解释:
    • $var 是要判断的变量或表达式,程序会将其值与后续的 case 值进行比较;
    • case value1: 表示一个匹配项:当 $var == value1(松散比较)时,可以有任何数量个 case 分支,支持不同类型:数字、字符串、常量等。
    • // code对应匹配成功后执行的代码块,可以包含任意有效的 PHP 代码。
    • break;关键中断指令:执行完当前 case 后跳出整个 switch 结构,如果省略,程序会继续执行下一个 case 的代码(称为”case 穿透”)。
    • default:$var 不匹配任何 case 时执行的默认分支,可以省略,但建议始终包含以处理意外情况,通常放在最后(非强制要求)。

1.3 循环语句

​ 循环语句功能:在循环条件满足的情况下,反复执行特定代码。

1.3.1 while 循环

语法

1
2
3
while (condition) {
// 重复执行的代码
}

特点

  • 先判断条件后执行
  • 条件为真时执行代码块
  • 条件为假时跳过整个循环

工作流程

1
2
3
4
5
6
7
开始

检查条件 → false → 结束
↓ true
执行代码块

返回检查条件

示例

1
2
3
4
5
6
7
8
9
10
$counter = 1;
while ($counter <= 3) {
echo "当前计数: $counter <br>";
$counter++;
}
/* 输出:
当前计数: 1
当前计数: 2
当前计数: 3
*/

1.3.2 do-while循环

语法

1
2
3
do {
// 重复执行的代码
} while (condition);

特点

  • 先执行一次代码块,再检查条件
  • 条件为真时继续执行
  • 至少执行一次代码块
  • 结尾的分号(;)不能省略

工作流程

1
2
3
4
5
6
7
开始

执行代码块

检查条件 → false → 结束
↓ true
返回执行代码块

示例

1
2
3
4
5
6
7
8
$i = 5;
do {
echo "值为: $i <br>";
$i++;
} while ($i <= 3);
/* 输出:
值为: 5
*/

1.3.3 for循环

语法

1
2
3
for (init; condition; increment) {
// 重复执行的代码
}

组成部分

  1. 初始化表达式 (init):循环开始时执行一次
  2. 循环条件 (condition):每次迭代前检查
  3. 递增/递减表达式 (increment):每次迭代后执行

工作流程

1
2
3
4
5
6
7
8
9
10
11
开始

执行init

检查condition → false → 结束
↓ true
执行代码块

执行increment

返回检查condition

示例

1
2
3
4
5
6
7
8
for ($i = 0; $i < 3; $i++) {
echo "迭代次数: $i <br>";
}
/* 输出:
迭代次数: 0
迭代次数: 1
迭代次数: 2
*/

高级用法

1
2
3
4
5
6
7
8
9
// 多表达式
for ($i=1, $j=5; $i<=5; $i++, $j--) {
echo "i: $i, j: $j <br>";
}

// 无限循环
for (;;) {
// 需要break语句终止
}

1.3.4 foreach循环

语法

1
2
3
4
5
6
7
foreach ($array as $value) {
// 使用 $value
}

foreach ($array as $key => $value) {
// 使用 $key 和 $value
}

特点

  • 专门遍历数组和对象
  • 自动迭代数组中的每个元素
  • 不需要维护计数器

工作流程

1
2
3
4
5
6
7
开始

获取第一个元素 → 无元素 → 结束

执行代码块

获取下一个元素

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$colors = ["red", "green", "blue"];

// 遍历值
foreach ($colors as $color) {
echo "$color ";
}
// 输出:red green blue

// 遍历键和值
foreach ($colors as $index => $color) {
echo "$index: $color<br>";
}
/* 输出:
0: red
1: green
2: blue
*/

高级特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 引用遍历(修改原数组)
$numbers = [1, 2, 3];
foreach ($numbers as &$num) {
$num *= 2;
}
print_r($numbers); // 输出:[2, 4, 6]

// 多维数组遍历
$users = [
["name" => "Alice", "age" => 28],
["name" => "Bob", "age" => 32]
];

foreach ($users as $user) {
echo $user['name'] . " is " . $user['age'] . " years old.<br>";
}

/* 输出:
Alice is 28 years old.
Bob is 32 years old. */

适用场景

  • 遍历数组元素
  • 处理关联数组
  • 操作多维数组

1.4 循环控制语句

1.4.1 break语句

  • 立即结束整个循环。

  • break n 可以指定跳出多少层循环。

    1
    2
    3
    4
    5
    6
    7
    for ($i = 0; $i < 10; $i++) {
    if ($i == 5) {
    break; // 跳出循环
    }
    echo $i;
    }
    // 输出:01234

1.4.2 continue语句

  • 跳过当前迭代,进入下一次循环。

  • continue n 可以指定跳过多少层迭代。

    1
    2
    3
    4
    5
    6
    7
    for ($i = 0; $i < 5; $i++) {
    if ($i == 2) {
    continue; // 跳过本次迭代
    }
    echo $i;
    }
    // 输出:0134

1.4.3 循环标签

​ 顾名思义循环标签就是给某一个循环赋予可自定义的名字,一是为了让程序更加清晰,二是为了跳出循环时可以比break n更加灵活,直观的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
outerLoop:    // 给外层循环贴标签
for ($i = 0; $i < 3; $i++) {

innerLoop: // 给内层循环贴标签
for ($j = 0; $j < 3; $j++) {
echo "$i-$j ";

// 可以根据条件指定跳出哪个循环
if ($i == 1 && $j == 1) {
break outerLoop; // 直接跳出外层循环
}
}
echo "<br>";
}

// 执行后会输出:
// 0-0 0-1 0-2
// 1-0 1-1

循环标签 vs break n

特性 循环标签 break n
可读性 更好(名称有意义) 需数层级
灵活性 可在不同作用域使用 只限连续嵌套
可靠性 修改结构不影响 层级改变需调整n值
使用场景 复杂多层且需精确控制 简单嵌套跳多层

2. 函数

2.1 函数定义

1
2
3
4
5
function 函数名(参数1, 参数2 = "默认值"): 返回值类型 
{
// 逻辑代码
return $返回值; // 可直接 return "结果";
}

关键特性

  • 默认参数:可选参数必须放在必选参数之后function calc($a, $b=10) {...}

  • 类型声明(PHP7+增强)

    1
    2
    3
    function add(int $a, float $b): string {
    return strval($a + $b);
    }
  • 无返回值时:可省略 return 或使用 return null

2.2 函数调用

1
$result = function(参数1, 参数2);
  • 传参方式
    • 值传递(默认):修改形参不影响实参
    • 引用传递:function foo(&$var) {...}(在函数定义时参数前加 & (如 function foo(&$param))。这种方式传递的是实参变量本身的内存地址,而不是值的拷贝。函数内部修改 $param 会直接影响调用处原始的 $arg 变量。图片中展示的是更常用的值传递。)
  • 返回值处理

​ 函数执行后返回给调用者的数据叫做返回值,可以用来传递数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php

// 1.没有参数,没有返回值的方法
function fun1(){
echo "没有参数,没有参会值的方法";
}

// 2.有参数,没有返回值的方法
function fun2($name){
echo "有参数,没有返回值的方法,参数是:$name";
}

// 3.有参数,有返回值的方法
function fun3($name){
$re = "返回值x";
return "有参数,有返回值的方法,返回值是:$re";
}

// 调用函数
fun1();

fun2("张三");

$x = fun3("admin");
echo $x;

?>

2.3 匿名函数

1
2
3
4
5
6
7
// 步骤1:创建匿名函数并赋值给变量
$greet = function($name) {
return "Hello $name";
};

// 步骤2:通过变量名调用匿名函数
echo $greet("World"); // 输出:Hello World
  • 匿名函数核心解析
    • 匿名
      • 普通函数:function sayHello() {...}。
      • 匿名函数:function(...){...} (没有函数名)。
    • 赋值给变量才能使用
      • $greet = function(...){...};
      • 通过 $greet 变量来“保存”这个函数。
    • 调用方式 = 变量名+括号
      • $greet("参数") 👉 像普通函数一样调用。
    • 参数传递
      • $name 接收传入的值(本例中接收 "World")。
    • 函数返回值
      • return "Hello $name" 返回拼接后的字符串。

3. 数组

​ 数组指数据的组合,能够在单个变量中存储多个值。可以将数组看作一个存储数据的盒子,盒子中有很多个格子,每个格子中都可存储一个数据。

  • 数组名:盒子名
  • 元素:格子中的数据
  • 索引:格子的位置
  • 长度:格子的数量

3.1 索引数组

​ 通过索引读取数组中的元素 :$数组名[索引];,索引从0开始。即数组中的第一个元素索引为0,以此类推。

1
2
3
4
5
6
<?php
$cars=array("Volvo","BMW","Toyota");

//通过索引 读取数组中的所有元素 $数组名[索引];
echo "$cars[0].$cars[1].$cars[2]";
?>

3.2 关联数组

3.2.1 核心概念:

    1. 键值对:关联数组中的每个元素都由两个部分组成——键(key)和值(value)
    1. 自定义键名:与索引数组使用从 0 开始的数字作为键(索引)不同,关联数组允许你使用字符串作为键名(也可以使用整数,但意义通常是自定义的)。这个键名是描述性的,代表了你要存储的值的含义。
    1. 映射关系:你可以把关联数组想象成一个词典或一张映射表。通过一个唯一的、有意义的键,你可以快速查找、访问或修改与之关联的值。

3.2.2 关联数组

  • 创建关联数组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 使用 array() 语法(较旧但仍然有效)
    $student = array(
    "name" => "张三",
    "age" => 20,
    "major" => "计算机科学"
    );

    // 使用更简洁的 [] 语法(PHP 5.4+ 推荐)
    $car = [
    "make" => "Toyota",
    "model" => "Camry",
    "year" => 2023
    ];
  • 访问元素

    1
    2
    echo $student["name"]; // 输出:张三
    echo $car["model"]; // 输出:Camry
  • 添加或修改元素

    1
    2
    $student["grade"] = "B+"; // 添加新元素
    $student["age"] = 21; // 修改现有元素
  • 注意:

    1. 键是唯一的,同一个数组中,不能有两个元素使用完全相同的键名。如果指定相同的键名,后面的值会覆盖前面的值。
    2. 键的类型可以是 整数 或 字符串,如果一个字符串键的内容恰好是一个有效的十进制整数(如 '123'),PHP 会自动将其转换为整数键(123)。
    3. 值的类型可以是PHP支持的任何类型。