首页 / PHP 入门教程 / PHP 函数

PHP 入门教程

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 官方文档,综合改写后所得。