写程序时,你一定会遇到这种情况:同一段逻辑,需要在多个地方使用。比如计算两个数字的和、判断用户是否登录、发送邮件通知……如果每次都把同样的代码重写一遍,程序会变得又长又难维护。
函数就是解决这个问题的:把一段代码打包,起一个名字,以后需要用的时候,直接“呼叫”这个名字就行。
---
一、什么是函数
函数可以理解成一个“小工厂”:你给它输入(叫参数),它执行内部的逻辑,然后给你输出(叫返回值)。
PHP 中有两类函数:
· 内置函数:PHP 已经帮你写好的,比如 echo、count()、array_push() 等
· 自定义函数:你自己写的,解决你自己的特定需求
这一部分我们重点学习如何自定义函数。
---
二、定义和调用函数
2.1 基本语法
```php
function 函数名(参数列表) {
// 函数体:要执行的代码
return 返回值; // 可选
}
```
规则:
· 用 function 关键字声明
· 函数名遵循变量命名规则(字母、数字、下划线,不能以数字开头)
· 函数名不区分大小写(但建议保持大小写一致)
· return 语句可以返回一个值,也可以不写
2.2 第一个自定义函数
```php
<?php
// 定义一个简单的打招呼函数
function sayHello() {
echo "你好,欢迎学习PHP!";
}
// 调用函数
sayHello(); // 输出:你好,欢迎学习PHP!
?>
```
2.3 带参数的函数
```php
<?php
// 带一个参数的函数
function greet($name) {
echo "你好," . $name . "!";
}
greet("张三"); // 输出:你好,张三!
greet("李四"); // 输出:你好,李四!
// 带多个参数的函数
function add($a, $b) {
$sum = $a + $b;
echo $a . " + " . $b . " = " . $sum;
}
add(5, 3); // 输出:5 + 3 = 8
?>
```
2.4 带返回值的函数
用 return 把结果传出来,而不是直接在函数内部输出:
```php
<?php
// 计算两个数的和,并返回结果
function add($a, $b) {
return $a + $b;
}
// 调用函数,拿到返回值后可以继续使用
$result = add(10, 20);
echo "计算结果:" . $result; // 输出:计算结果:30
// 也可以直接用在表达式中
$total = add(5, 5) + add(3, 2);
echo $total; // 输出:15
?>
```
return 会立即结束函数的执行。return 后面的代码不会运行。
---
三、参数详解
3.1 默认参数
可以给参数设置默认值。调用时如果不传这个参数,就使用默认值:
```php
<?php
function greet($name = "朋友") {
echo "你好," . $name . "!";
}
greet("张三"); // 输出:你好,张三!
greet(); // 输出:你好,朋友!(使用了默认值)
?>
```
注意:有默认值的参数要放在右边:
```php
// 正确写法
function createUser($username, $role = "普通用户") { }
// 错误写法(默认参数不能在左边)
function createUser($role = "普通用户", $username) { }
```
3.2 参数传递方式
默认情况下,参数是按值传递的:函数内部修改参数,不会影响外面的变量:
```php
<?php
function addTen($num) {
$num = $num + 10;
echo "函数内部:" . $num; // 输出:函数内部:20
}
$myNum = 10;
addTen($myNum);
echo "函数外部:" . $myNum; // 输出:函数外部:10(没有变化)
?>
```
如果想在函数内部修改外部变量,可以用引用传递,在参数前加 &:
```php
<?php
function addTen(&$num) {
$num = $num + 10;
}
$myNum = 10;
addTen($myNum);
echo $myNum; // 输出:20(外部变量被修改了)
?>
```
3.3 可变数量的参数
PHP 支持传入任意数量的参数,用 ... 操作符收集:
```php
<?php
function sumAll(...$numbers) {
$total = 0;
foreach ($numbers as $num) {
$total += $num;
}
return $total;
}
echo sumAll(1, 2, 3); // 输出:6
echo sumAll(10, 20, 30, 40); // 输出:100
?>
```
---
四、变量的作用域
变量在程序中是有“活动范围”的,这叫作用域。
4.1 局部变量
在函数内部定义的变量,只能在函数内部使用:
```php
<?php
function myTest() {
$localVar = 10; // 局部变量
echo $localVar; // 可以访问
}
myTest();
echo $localVar; // 错误!函数外部无法访问
?>
```
4.2 全局变量
在函数外部定义的变量,默认不能直接在函数内部使用:
```php
<?php
$globalVar = 20; // 全局变量
function myTest() {
echo $globalVar; // 错误!访问不到
}
myTest();
?>
```
如果想在函数内部访问全局变量,需要用 global 关键字:
```php
<?php
$globalVar = 20;
function myTest() {
global $globalVar;
echo $globalVar; // 输出:20
}
myTest();
?>
```
或者用 $GLOBALS 数组:
```php
<?php
$globalVar = 20;
function myTest() {
echo $GLOBALS["globalVar"]; // 输出:20
}
myTest();
?>
```
4.3 静态变量
函数内的普通变量,每次调用函数时都会重新初始化。如果想让变量保留上一次的值,可以用 static:
```php
<?php
function counter() {
static $count = 0; // 只会在第一次调用时初始化
$count++;
echo "调用了 " . $count . " 次\n";
}
counter(); // 调用了 1 次
counter(); // 调用了 2 次
counter(); // 调用了 3 次
?>
```
---
五、综合练习:学生成绩管理函数库
把前面学过的数组、条件判断、循环,封装成函数:
```php
<?php
// ========== 函数定义区 ==========
/**
* 计算学生的总分
* @param array $student 学生数组,包含 chinese, math, english 成绩
* @return int 总分
*/
function calculateTotal($student) {
return $student["chinese"] + $student["math"] + $student["english"];
}
/**
* 计算学生的平均分
* @param array $student 学生数组
* @return float 平均分
*/
function calculateAverage($student) {
$total = calculateTotal($student);
return $total / 3;
}
/**
* 根据平均分评定等级
* @param float $average 平均分
* @return string 等级
*/
function getGrade($average) {
if ($average >= 90) {
return "优秀";
} elseif ($average >= 75) {
return "良好";
} elseif ($average >= 60) {
return "及格";
} else {
return "不及格";
}
}
/**
* 检查是否有不及格科目
* @param array $student 学生数组
* @return bool 是否有不及格科目
*/
function hasFailSubject($student) {
return ($student["chinese"] < 60 || $student["math"] < 60 || $student["english"] < 60);
}
/**
* 打印单个学生的成绩单
* @param array $student 学生数组
*/
function printStudentReport($student) {
$total = calculateTotal($student);
$average = calculateAverage($student);
$grade = getGrade($average);
$hasFail = hasFailSubject($student);
echo $student["name"] . " | 总分:" . $total . " | 平均:" . round($average, 1) . " | 等级:" . $grade;
if ($hasFail) {
echo " | ⚠️ 有不及格科目";
}
echo "\n";
}
/**
* 计算班级平均分
* @param array $students 所有学生数组
* @return float 班级平均分
*/
function calculateClassAverage($students) {
$totalScore = 0;
$subjectCount = 0;
foreach ($students as $student) {
$totalScore += calculateTotal($student);
$subjectCount += 3;
}
return $totalScore / $subjectCount;
}
// ========== 主程序:使用上面的函数 ==========
$students = [
["name" => "张三", "chinese" => 85, "math" => 90, "english" => 78],
["name" => "李四", "chinese" => 72, "math" => 88, "english" => 92],
["name" => "王五", "chinese" => 91, "math" => 76, "english" => 85],
["name" => "赵六", "chinese" => 58, "math" => 65, "english" => 70]
];
echo "========== 成绩单 ==========\n";
foreach ($students as $student) {
printStudentReport($student);
}
$classAverage = calculateClassAverage($students);
echo "\n========== 班级统计 ==========\n";
echo "班级平均分:" . round($classAverage, 1) . "\n";
?>
```
输出:
```
========== 成绩单 ==========
张三 | 总分:253 | 平均:84.3 | 等级:良好
李四 | 总分:252 | 平均:84 | 等级:良好
王五 | 总分:252 | 平均:84 | 等级:良好
赵六 | 总分:193 | 平均:64.3 | 等级:及格 | ⚠️ 有不及格科目
========== 班级统计 ==========
班级平均分:79.2
```
---
六、常用内置函数
PHP 内置了大量函数,这里列出最常用的几类,建议收藏备查:
6.1 字符串函数
函数 作用 示例
strlen() 获取字符串长度 strlen("Hello") → 5
strpos() 查找子串位置 strpos("Hello world", "world") → 6
substr() 截取字符串 substr("Hello", 1, 3) → "ell"
str_replace() 替换字符串 str_replace("world", "PHP", "Hello world") → "Hello PHP"
trim() 去除首尾空白 trim(" Hello ") → "Hello"
strtoupper() 转大写 strtoupper("hello") → "HELLO"
strtolower() 转小写 strtolower("HELLO") → "hello"
6.2 数组函数
函数 作用 示例
count() 获取数组长度 count([1,2,3]) → 3
array_merge() 合并数组 array_merge([1,2], [3,4]) → [1,2,3,4]
array_keys() 获取所有键 array_keys(["a"=>1, "b"=>2]) → ["a","b"]
array_values() 获取所有值 array_values(["a"=>1, "b"=>2]) → [1,2]
in_array() 判断值是否存在 in_array("苹果", ["苹果","香蕉"]) → true
array_sum() 计算数组和 array_sum([1,2,3]) → 6
array_reverse() 反转数组 array_reverse([1,2,3]) → [3,2,1]
6.3 数学函数
函数 作用 示例
round() 四舍五入 round(3.14159, 2) → 3.14
ceil() 向上取整 ceil(3.1) → 4
floor() 向下取整 floor(3.9) → 3
rand() 生成随机数 rand(1, 100) → 1-100之间的随机数
max() 取最大值 max([1,5,3]) → 5
min() 取最小值 min([1,5,3]) → 1
---
七、小结
这一部分我们学习了:
知识点 核心内容
函数定义 function 函数名() { }
函数调用 函数名()
参数 可以有一个或多个,支持默认值
返回值 用 return 返回结果
引用传递 加 & 可以在函数内修改外部变量
作用域 局部变量、全局变量(global)、静态变量(static)
内置函数 字符串、数组、数学等常用函数
函数是代码复用的基础。当你发现自己正在复制粘贴同一段代码时,就应该考虑把它封装成函数。
下一部分,我们将学习文件包含——如何把一个PHP文件引入到另一个文件中使用,这是组织大型项目的基础。