PHP: 函数基础

函数是编程的基本单元。把重复使用的代码包装成函数,你就从"写脚本的人"升级为"搭积木的人"——每个函数都是可复用的积木块。

1. 定义与调用函数

PHP
<?php
// 定义一个函数
function greet() {
    echo "你好,世界!";
}

// 调用函数
greet();  // 输出:你好,世界!
greet();  // 可以反复调用
?>

函数名不区分大小写(但习惯用小写+下划线 snake_case):

PHP
GREET();  // 也能调用,但别这么写

2. 参数与返回值

函数可以接收参数(输入)并返回数据(输出):

PHP
<?php
// 带参数的函数
function greet($name) {
    return "你好,{$name}!";
}

$msg = greet("小明");
echo $msg;  // 你好,小明!
?>

(1) 多个参数

PHP
<?php
function calculateTotal($price, $quantity, $tax = 1.0) {
    return $price * $quantity * $tax;
}

echo calculateTotal(10, 3);     // 30(tax使用默认值1.0)
echo calculateTotal(10, 3, 1.13); // 33.9(传入自定义tax)
?>
💡 提示: 有默认值的参数必须放在没有默认值的参数后面。function f($a = 1, $b) 会报错。


3. 类型声明(PHP 7+)

PHP 7 开始支持函数参数和返回值的类型声明,让代码更安全:

PHP
<?php
// 参数类型声明 + 返回类型声明
function add(int $a, int $b): int {
    return $a + $b;
}

echo add(3, 5);      // 8
echo add("3", "5");  // 8(PHP 会自动转换)
// echo add("hello", 5); // TypeError!

// 其他类型声明
function displayUser(string $name, int $age): void {
    echo "{$name},{$age}岁";
}

function getPrice(float $price): string {
    return "¥" . number_format($price, 2);
}
?>
类型 声明写法 说明
整数 int 自动转整数
浮点 float 自动转浮点
字符串 string 自动转字符串
布尔 bool 自动转布尔
数组 array 必须是数组
无返回 void 不能 return
可为 null ?string 接受 string 或 null
联合类型(PHP 8+) int|float 接受 int 或 float
混合类型 mixed 任意类型
💡 提示: 写新代码时总是加类型声明。它不仅让代码意图更清晰,还能提前发现 bug——调用方传了错误类型时直接报 TypeError,而不是默默出奇怪的结果。

▶ 示例:带类型声明的实用函数

PHP
<?php
// 类型声明组合:联合类型 + void + 默认值
function formatPrice(int|float $price, string $currency = "¥"): string {
    return $currency . number_format((float)$price, 2);
}

function logAction(string $user, string $action): void {
    echo "[" . date("H:i:s") . "] {$user} 执行了 {$action}<br>";
}

echo formatPrice(39.9);       // ¥39.90
echo formatPrice(100);        // ¥100.00
logAction("admin", "登录系统"); // [14:30:45] admin 执行了 登录系统
?>
▶ 试一试

4. 严格模式(strict_types)

默认情况下,PHP 的类型声明会做自动类型转换"3" 可以传给 int 参数)。开启严格模式后,类型必须完全匹配:

▶ 示例:默认 vs 严格模式

PHP
<?php
// 默认模式:自动类型转换
function double(int $n): int {
    return $n * 2;
}
echo double("5");  // 10("5"自动转为int 5)

// 严格模式:按规矩来
declare(strict_types=1);

function doubleStrict(int $n): int {
    return $n * 2;
}
echo doubleStrict("5");  // TypeError! 必须传 int
echo doubleStrict(5);    // 10 ✅

function greetStrict(string $name): string {
    return "你好,{$name}";
}
// echo greetStrict(123);  // TypeError! 数字不是字符串
echo greetStrict("小明");  // ✅
?>
▶ 试一试
💡 提示: declare(strict_types=1) 必须写在 PHP 文件的第一行(<?php 标签之后的第一条语句)。它只影响当前文件中的函数调用,不影响被调用的函数定义文件。新项目建议默认开启严格模式。


5. return 语句

PHP
<?php
function getUser($id) {
    // 查数据库...假设这里查到了
    if ($id <= 0) {
        return null;  // 无效ID,直接返回
    }
    return [
        "id" => $id,
        "name" => "用户{$id}"
    ];
}

$user = getUser(1);
if ($user !== null) {
    echo $user["name"];  // 用户1
}

// void 函数:不返回任何东西
function logError(string $message): void {
    // 写日志
    error_log($message);
    // 不能写 return $something;
}
?>

return 后函数立即结束——这在卫语句中特别有用(先处理异常情况,提前返回)。


6. PHPDoc 注释

好的函数需要文档。PHPDoc 是 PHP 的注释标准:

PHP
<?php
/**
 * 计算商品总价
 *
 * @param float $price    商品单价
 * @param int   $quantity 购买数量
 * @param float $tax      税率(默认 1.0 即含税)
 * @return float 最终总价
 *
 * 示例:
 *   calculateTotal(10, 3)      → 30.0
 *   calculateTotal(10, 3, 1.13) → 33.9
 */
function calculateTotal(float $price, int $quantity, float $tax = 1.0): float {
    return $price * $quantity * $tax;
}
?>
标签 说明
@param 参数说明(类型 + 名称 + 描述)
@return 返回值说明
@throws 可能抛出的异常
@var 变量类型
@see 相关引用
💡 提示: PHPDoc 不只是给人看的——VS Code 的 Intelephense 插件会根据它提供自动补全和类型提示。写好 PHPDoc,IDE 会变成你的智能助手。


7. 函数命名规范

PHP 的函数名以 snake_case 为社区标准:

PHP
// ✅ 好的函数名
function get_user_by_id($id) {}
function calculate_total_price($items) {}
function send_verification_email($email) {}

// ❌ 混乱的命名
function GetUserById($id) {}      // 不要 PascalCase
function getUserById($id) {}      // 不要 camelCase(方法与函数不同)
function getUserbyid($id) {}      // 不要全小写无分隔
💡 提示: 动词 + 名词:get_(获取)、set_(设置)、calculate_(计算)、create_(创建)、delete_(删除)、validate_(验证)、format_(格式化)。

❓ 常见问题

Q 什么时候用 void 返回类型?
A 当函数只做操作不返回数据时——比如输出页面、写日志、发邮件、修改全局状态。void 让调用方知道"这个函数是执行操作,别期待它有返回值"。
Q 类型声明和类型转换有什么区别?
A 类型声明在函数签名中定义"期望什么类型",PHP 在调用时自动做类型转换。开启 strict_types 后不自动转换——传错类型直接报错,更安全。
Q return 后面还能写代码吗?
A 能写,但不会执行。return 会立即结束函数。不过 IDE 通常会警告"unreachable code"(不可达代码)。

📖 小节

📝 作业

  1. 写一个函数 calculateBMI($weight, $height),接收体重(kg)和身高(m),返回 BMI 指数(体重 ÷ 身高²)并附加"偏瘦/正常/超重/肥胖"的评价。
  2. 开启严格模式,写一个函数 formatCurrency(float $amount, string $symbol = "¥"): string,格式化金额输出。用严格模式确保传入的金额是浮点数。
  3. 写一个函数 getPageUrl(string $base, int $page): string,拼接分页 URL。如果 page 为 1,只返回 base;其他页码拼接 ?page=N。写好 PHPDoc 注释。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏