为什么要用函数

写代码时你会发现有些逻辑反复出现:校验邮箱、拼格式化字符串、算运费。把这段逻辑包进函数,起个好名字,以后一行调用就完事;需求变了也只需要改一处,而不是满文件找重复代码。

定义与调用

PHP 用 function 关键字定义函数:

<?php
function greet($name) {
    return "你好," . $name . "!";
}

echo greet("小雪");   // 输出:你好,小雪!
echo greet("阿梨");   // 输出:你好,阿梨!

PHP 里函数在定义之前也能调用(同一文件内),但为了可读性,还是建议先定义、后使用。

参数与默认值

参数可以带默认值,调用时不传就用默认值:

<?php
function makeCoffee($type = "拿铁", $sugar = 1) {
    return "一杯{$type},加 {$sugar} 块糖";
}

echo makeCoffee();          // 输出:一杯拿铁,加 1 块糖
echo makeCoffee("美式");     // 输出:一杯美式,加 1 块糖
echo makeCoffee("美式", 0);  // 输出:一杯美式,加 0 块糖

PHP 8.0 起还支持按参数名传值,顺序就不用记了:

<?php
echo makeCoffee(sugar: 2, type: "摩卡");  // 输出:一杯摩卡,加 2 块糖

返回值

return 把结果交还给调用方,函数执行到 return 就结束。需要带回多个结果时,可以返回数组再解构:

<?php
function divmod($a, $b) {
    return [intdiv($a, $b), $a % $b];
}

[$quotient, $remainder] = divmod(17, 5);
echo $quotient;    // 输出:3
echo $remainder;   // 输出:2

没有 return 语句的函数返回 null,这类函数适合表示"只做事、不回话"。

变量作用域

函数内部默认看不到外部的变量,这是新手最容易踩的坑:

<?php
$count = 10;

function show() {
    // echo $count;  // 报错:$count 在函数内未定义
    $count = 99;      // 这是函数自己的局部变量
    echo $count;      // 输出:99
}

show();
echo $count;          // 输出:10,外部的 $count 没被动过

确实要用外部数据时,把它当参数传进来是最清晰的做法;global 关键字能用,但会让代码变难懂,不推荐。

可变数量的参数

参数个数不确定时,用 ... 把它们收进数组:

<?php
function sum(...$nums) {
    $total = 0;
    foreach ($nums as $n) {
        $total += $n;
    }
    return $total;
}

echo sum(1, 2, 3);        // 输出:6
echo sum(10, 20, 30, 40); // 输出:100

小结

这篇讲了 PHP 函数的几块基本功:function 定义与 return 返回值、默认参数与命名参数、函数内外的变量作用域,以及 ... 可变参数。写的时候记住两条:能用参数传的就别用 global;一个函数尽量只做一件事,事情多了就再拆一层。