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"(不可达代码)。📖 小节
function name($param): type { return ... }定义函数- 参数可设默认值(必须放在必选参数后面)
- 类型声明(
int,string,?string,int|float)让代码更安全 declare(strict_types=1)开启严格模式,拒绝自动类型转换void无返回值,return立即结束函数- 函数名用
snake_case,动词+名词像get_user_by_id - PHPDoc 注释既给人读,也给 IDE 读
📝 作业
- 写一个函数
calculateBMI($weight, $height),接收体重(kg)和身高(m),返回 BMI 指数(体重 ÷ 身高²)并附加"偏瘦/正常/超重/肥胖"的评价。 - 开启严格模式,写一个函数
formatCurrency(float $amount, string $symbol = "¥"): string,格式化金额输出。用严格模式确保传入的金额是浮点数。 - 写一个函数
getPageUrl(string $base, int $page): string,拼接分页 URL。如果 page 为 1,只返回 base;其他页码拼接?page=N。写好 PHPDoc 注释。