PHP 入门教程
16.4 可变参数
16.7 箭头函数
PHP 函数
本教程共 65 篇 · 第 16 篇 · 更新于 2026-07-24 · 约 4 分钟阅读
PHPPHP8函数参数返回值匿名函数箭头函数
16. PHP 函数
本节目标:掌握函数的定义、调用和现代语法特性。学完你能封装可复用的代码块,写出模块化的程序。
16.1 函数基础
函数是将一段代码封装起来,供反复调用的结构:
<?php
function sayHello(): void {
echo "你好,PHP!";
}
sayHello(); // 你好,PHP!
sayHello(); // 你好,PHP!
?>
16.2 参数与返回值
<?php
// 带参数和返回值
function add(int $a, int $b): int {
return $a + $b;
}
$result = add(3, 5);
echo $result; // 8
// 多个参数
function greet(string $name, string $greeting = "你好"): string {
return "$greeting,$name!";
}
echo greet("张三"); // 你好,张三!
echo greet("李四", "早上好"); // 早上好,李四!
?>
Tip默认参数必须放在非默认参数之后。
function test($a = 1, $b)是错误的。
16.3 类型声明
PHP 7+ 支持完整的参数和返回类型声明:
<?php
function multiply(float $a, float $b): float {
return $a * $b;
}
// 严格模式(文件开头声明)
declare(strict_types=1);
function divide(int $a, int $b): float {
if ($b === 0) {
throw new \Exception("除数不能为 0");
}
return $a / $b;
}
echo divide(10, 3); // 3.333...
?>
16.4 可变参数 ...
<?php
// 接受任意数量的参数
function sum(int ...$numbers): int {
$total = 0;
foreach ($numbers as $num) {
$total += $num;
}
return $total;
}
echo sum(1, 2, 3); // 6
echo sum(10, 20); // 30
echo sum(); // 0
// 展开数组传入
$arr = [1, 2, 3, 4];
echo sum(...$arr); // 10
// 混合使用
function logMessage(string $level, string ...$messages): void {
foreach ($messages as $msg) {
echo "[$level] $msg\n";
}
}
logMessage("INFO", "启动成功", "连接数据库", "加载配置");
?>
16.5 命名参数(PHP 8.0+)
<?php
function createUser(
string $name,
string $email,
int $age = 18,
bool $isActive = true
): array {
return compact('name', 'email', 'age', 'isActive');
}
// 传统调用:必须按顺序,中间的不想传也要传
// $user = createUser("张三", "zs@example.com", 25, true);
// PHP 8.0+ 命名参数:跳过中间参数,顺序任意
$user = createUser(
name: "张三",
email: "zs@example.com",
age: 25
);
print_r($user);
?>
Note命名参数让函数调用更清晰,特别适合参数较多的函数。但注意:命名参数与位置参数混用时,位置参数必须在前。
16.6 匿名函数(闭包)
没有名称的函数,通常赋值给变量或作为参数传递:
<?php
// 赋值给变量
$square = function(int $n): int {
return $n * $n;
};
echo $square(5); // 25
// 作为回调函数
$nums = [1, 2, 3, 4];
$squared = array_map(function($n) {
return $n * $n;
}, $nums);
// [1, 4, 9, 16]
// 闭包:引用外部变量
$multiplier = 3;
$multiply = function(int $n) use ($multiplier): int {
return $n * $multiplier;
};
echo $multiply(5); // 15
// 引用外部变量并修改
$count = 0;
$increment = function() use (&$count): void {
$count++;
};
$increment();
$increment();
echo $count; // 2
?>
16.7 箭头函数 fn()(PHP 7.4+)
箭头函数是匿名函数的简写,自动捕获外部变量:
<?php
$factor = 10;
// 传统匿名函数
$multiply = function($n) use ($factor) {
return $n * $factor;
};
// 箭头函数:自动捕获变量,更简洁
$multiply2 = fn($n) => $n * $factor;
echo $multiply2(5); // 50
// 多参数箭头函数
$add = fn($a, $b) => $a + $b;
echo $add(2, 3); // 5
// 数组操作中使用
$prices = [10, 20, 30];
$taxRate = 0.1;
$withTax = array_map(fn($p) => $p * (1 + $taxRate), $prices);
// [11, 22, 33]
?>
Tip箭头函数自动按值捕获外部变量(相当于
use ($var))。如果需要引用,仍需用传统匿名函数。
16.8 函数返回值多类型(PHP 8.0+)
<?php
// 联合类型返回
function findUser(int $id): array|null {
if ($id <= 0) {
return null;
}
return ["id" => $id, "name" => "用户$id"];
}
// 使用 nullsafe 处理
$user = findUser(5);
echo $user?['name'] ?? '未找到';
?>
16.9 回调函数类型
<?php
// 声明参数必须是 callable
function processArray(array $arr, callable $callback): array {
$result = [];
foreach ($arr as $item) {
$result[] = $callback($item);
}
return $result;
}
$nums = [1, 2, 3];
$doubled = processArray($nums, fn($n) => $n * 2);
// [2, 4, 6]
?>
16.10 常见错误
<?php
// 错误 1:在函数定义前调用函数(某些情况下会报错)
// sayHi(); // 如果函数在下面定义,这行可能报错
// 错误 2:返回值类型与声明不匹配
function getScore(): int {
return "95"; // PHP 8.0+ 会触发弃用警告
}
// 错误 3:忘记 return
function noReturn(): int {
// 没有 return 语句
}
// 错误 4:在 return 后写代码(不会执行)
function test(): int {
return 1;
echo "这行不会执行"; // 死代码
}
?>
来源:参考了 w3cschool「PHP 函数」、runoob「PHP 函数」以及 php.net 官方文档,综合改写后所得。