PHP 零基础教程

PHP 自定义函数

在 PHP 中,函数是极其重要的基础构建块。它们允许开发者将执行特定任务的代码块封装起来。这种封装机制不仅避免了代码冗余,还将逻辑组织成了独立且自洽的单元,从而极大地提升了代码的复用性、模块化程度以及后期的维护效率。

1. 定义自定义函数

在 PHP 中,声明一个用户自定义函数需要使用 function 关键字,紧接着是函数的名称、一对圆括号 (),然后是包裹在花括号 {} 中的代码块。

函数名必须以字母或下划线开头,后面可以跟任意数量的字母、数字或下划线。虽然 PHP 的函数名不区分大小写,但为了养成良好的编程习惯,通常建议使用一致的命名规范(业界最常用的是 camelCase 驼峰命名法)。

<?php
// 没有参数也没有返回值的基本函数定义
function greetUser() {
    echo "你好,欢迎使用我们的应用程序!";
}

// 带有一个参数的函数定义
function displayMessage($message) {
    echo $message;
}

// 带有多个参数的函数定义
function addNumbers($num1, $num2) {
    $sum = $num1 + $num2;
    echo "总和是:" . $sum;
}

// 带有参数且具有默认值的函数定义(我们将在下一章详细讲解)
// 这里只是为了提供上下文提前让你看一眼,完整的解释在后面。
function sayGoodbye($name = "游客") {
    echo "再见," . $name . "!";
}
?>

1.1 函数命名规范 (Naming Conventions)

虽然 PHP 允许函数名不区分大小写,但坚持使用一致的命名规范可以大大提高代码的可读性和可维护性。在 PHP 开发中,最常见的函数命名规范是 camelCase(小驼峰命名法):即第一个单词全小写,后续每个单词的首字母大写(例如:calculateTotal, getUserProfile)。

此外,应尽量避免使用单字母的函数名或过于宽泛的名字(如 do_stuff()),确保名字能清晰地表达该函数的具体用途。

<?php
// 好的做法:使用小驼峰命名法 (camelCase)
function calculateAreaOfRectangle($length, $width) {
    return $length * $width;
}

// 可以接受,但在现代 PHP 中不太常见:蛇形命名法 (snake_case)
function calculate_area_of_rectangle($length, $width) {
    return $length * $width;
}

// 避免:大小写不一致(虽然 PHP 依然能执行它,但这很糟糕)
function CalculateAreaOfRectangle($length, $width) { // 首字母大写了
    return $length * $width;
}

// 避免:名字太宽泛,目的不明确
function processData($data) {
    // ... 逻辑代码 ...
}
?>

2. 调用自定义函数

一旦函数被定义好,你就可以通过引用它的名字并紧跟一对圆括号来执行它,这个动作被称为“调用 (calling)”。如果函数需要接收参数,你需要将这些值传递到圆括号内。当函数被调用时,它内部包含的代码就会被执行。

<?php
// 定义一个简单的函数
function showGreeting() {
    echo "早上好!\n";
}

// 定义一个接收名字作为参数的函数
function personalizeGreeting($name) {
    echo "你好," . $name . "!\n";
}

// 调用 showGreeting 函数
showGreeting(); // 输出:早上好!

// 传入参数来调用 personalizeGreeting 函数
personalizeGreeting("爱丽丝"); // 输出:你好,爱丽丝!
personalizeGreeting("鲍勃");   // 输出:你好,鲍勃!

// 调用在脚本前面定义过的函数的例子
function performCalculation() {
    $result = 5 * 10;
    echo "计算结果是:" . $result . "\n";
}

performCalculation(); // 输出:计算结果是:50
?>

函数可以在整个脚本中被多次调用,这使得它们非常适合处理那些需要重复执行的任务。例如,如果你有一段验证用户输入的代码,你可以把它定义为一个函数,并在每次用户提交表单时调用它。这能防止你在应用程序的不同地方反复编写相同的验证逻辑。

3. 函数的执行流程

当 PHP 遇到一个函数调用时,它会暂时暂停主脚本的执行,跳转到该函数的定义处,执行函数体内的所有语句,然后返回到函数被调用的那个位置,恢复主脚本的后续执行。

想象一个用户登录流程:

  1. 主脚本: 用户提交登录表单。
  2. 主脚本: 调用 validateCredentials() 函数。
  3. 函数 validateCredentials()将用户名和密码与数据库进行核对。
  4. 函数 validateCredentials()返回 truefalse
  5. 主脚本: 接收返回值,并据此决定是跳转页面还是显示错误信息。

这完美展示了函数是如何抽象并隐藏复杂逻辑的,它让主脚本保持整洁,并能专注于整体的业务流程。

4. 综合实战案例

让我们来看几个更全面的例子,演示在不同场景下如何定义和调用函数。

4.1 案例 1:计算圆的面积

这个函数接收半径作为参数并计算面积。

<?php
/**
 * 计算圆的面积。
 *
 * @param float $radius 圆的半径。
 * @return void (此函数直接 echo 输出结果,无返回值)
 */
function calculateCircleArea($radius) {
    $pi = 3.14159; // 使用常量值代表 Pi
    $area = $pi * $radius * $radius; // 面积 = Pi * r^2
    echo "半径为 " . $radius . " 的圆的面积是:" . $area . "\n";
}

// 使用不同的半径调用函数
calculateCircleArea(5);  // 输出:半径为 5 的圆的面积是:78.53975
calculateCircleArea(10); // 输出:半径为 10 的圆的面积是:314.159
calculateCircleArea(2.5); // 输出:半径为 2.5 的圆的面积是:19.6349375
?>

4.2 案例 2:生成个性化欢迎信息

这个函数接收用户的名字和首选语言,以此来构建一条欢迎信息。

<?php
/**
 * 根据名字和语言生成个性化的欢迎信息。
 *
 * @param string $userName 用户名。
 * @param string $language 首选语言('en' 代表英语,'es' 代表西班牙语)。
 * @return void (此函数直接 echo 输出结果)
 */
function createWelcomeMessage($userName, $language) {
    if ($language == 'en') {
        echo "Welcome, " . $userName . "! Enjoy your stay.\n";
    } elseif ($language == 'es') {
        echo "¡Bienvenido, " . $userName . "! Disfruta tu estancia.\n";
    } else {
        echo "你好," . $userName . "!暂不支持该语言。\n";
    }
}

// 传入不同的名字和语言调用函数
createWelcomeMessage("Maria", "es"); // 输出:¡Bienvenido, Maria! Disfruta tu estancia.
createWelcomeMessage("John", "en");  // 输出:Welcome, John! Enjoy your stay.
createWelcomeMessage("Anna", "fr");  // 输出:你好,Anna!暂不支持该语言。
?>

4.3 案例 3:模拟简易交易日志记录

这个函数用于生成一条金融交易的日志记录。

<?php
/**
 * 记录一条包含时间戳、类型和金额的交易条目。
 *
 * @param string $transactionType 交易类型 (例如:"存款", "取款")。
 * @param float $amount 交易金额。
 * @return void (此函数直接 echo 输出日志条目)
 */
function logTransaction($transactionType, $amount) {
    $timestamp = date("Y-m-d H:i:s"); // 获取当前的日期和时间
    echo "[" . $timestamp . "] 交易类型:" . $transactionType . ",金额:$" . number_format($amount, 2) . "\n";
}

// 调用函数记录不同的交易
logTransaction("存款", 150.75);    // 输出:[2023-10-27 10:30:00] 交易类型:存款,金额:$150.75
logTransaction("取款", 50.00);     // 输出:[2023-10-27 10:31:05] 交易类型:取款,金额:$50.00
logTransaction("转账", 200.50);    // 输出:[2023-10-27 10:32:10] 交易类型:转账,金额:$200.50
?>