Skip to content

第 8 章:函数

8.1 自定义函数语法

基本语法

php
<?php
function 函数名(参数1, 参数2, ...) {
    // 函数体
    return 返回值;
}
?>

示例代码

php
<?php
// 无参数无返回值的函数
function sayHello() {
    echo "Hello, PHP!";
}

// 调用函数
sayHello();

// 有参数无返回值的函数
function greet($name) {
    echo "Hello, $name!";
}

greet("张三");

// 有参数有返回值的函数
function add($a, $b) {
    return $a + $b;
}

$result = add(5, 3);
echo $result; // 输出 8
?>

8.2 形参、实参、默认参数

形参和实参

  • 形参:函数定义时的参数,是形式上的参数
  • 实参:函数调用时传递的参数,是实际的值
php
<?php
function add($a, $b) { // $a 和 $b 是形参
    return $a + $b;
}

$result = add(5, 3); // 5 和 3 是实参
echo $result; // 输出 8
?>

默认参数

默认参数允许函数在调用时不传递某些参数,使用默认值。

php
<?php
function greet($name, $greeting = "Hello") {
    echo "$greeting, $name!";
}

// 使用默认值
greet("张三"); // 输出 "Hello, 张三!"

// 覆盖默认值
greet("张三", "Hi"); // 输出 "Hi, 张三!"
?>

注意事项

  • 默认参数必须放在参数列表的末尾
  • 可以有多个默认参数
php
<?php
// 正确的写法
function calculate($a, $b = 1, $operation = "add") {
    switch ($operation) {
        case "add":
            return $a + $b;
        case "subtract":
            return $a - $b;
        default:
            return $a + $b;
    }
}

// 错误的写法(默认参数后面不能有非默认参数)
// function calculate($a = 0, $b, $operation) {
//     // ...
// }
?>

8.3 返回值 return

return 语句

return 语句用于从函数中返回值,并终止函数的执行。

php
<?php
function add($a, $b) {
    return $a + $b; // 返回计算结果
    // return 语句后的代码不会执行
    echo "这行代码不会执行";
}

$result = add(5, 3);
echo $result; // 输出 8
?>

返回多个值

PHP 函数只能返回一个值,但可以通过数组返回多个值。

php
<?php
function getPerson() {
    return [
        "name" => "张三",
        "age" => 25,
        "email" => "zhangsan@example.com"
    ];
}

$person = getPerson();
echo $person["name"]; // 输出 "张三"
echo $person["age"]; // 输出 25
?>

8.4 变量作用域(全局 / 局部)

局部变量

在函数内部定义的变量,只在函数内部有效。

php
<?php
function test() {
    $localVar = "局部变量";
    echo $localVar; // 可以访问
}

test();
echo $localVar; // 错误:变量未定义
?>

全局变量

在函数外部定义的变量,默认情况下在函数内部不能直接访问。

php
<?php
$globalVar = "全局变量";

function test() {
    echo $globalVar; // 错误:变量未定义
}

test();
?>

使用 global 关键字

使用 global 关键字可以在函数内部访问全局变量。

php
<?php
$globalVar = "全局变量";

function test() {
    global $globalVar;
    echo $globalVar; // 可以访问
}

test(); // 输出 "全局变量"
?>

使用 $GLOBALS 数组

$GLOBALS 是一个超全局数组,包含所有全局变量。

php
<?php
$globalVar = "全局变量";

function test() {
    echo $GLOBALS["globalVar"]; // 可以访问
}

test(); // 输出 "全局变量"
?>

8.5 系统常用函数(字符串、数组、时间)

字符串函数

函数描述示例
strlen()获取字符串长度strlen("Hello") → 5
strpos()查找字符串位置strpos("Hello", "e") → 1
substr()截取字符串substr("Hello", 1, 3) → "ell"
str_replace()替换字符串str_replace("Hello", "Hi", "Hello World") → "Hi World"
strtolower()转换为小写strtolower("HELLO") → "hello"
strtoupper()转换为大写strtoupper("hello") → "HELLO"
trim()去除首尾空格trim(" Hello ") → "Hello"

数组函数

函数描述示例
count()获取数组长度count([1, 2, 3]) → 3
array_push()在数组末尾添加元素array_push($arr, "value")
array_pop()删除数组末尾元素array_pop($arr)
array_shift()删除数组开头元素array_shift($arr)
array_unshift()在数组开头添加元素array_unshift($arr, "value")
array_merge()合并数组array_merge($arr1, $arr2)
in_array()检查元素是否在数组中in_array("value", $arr)
sort()对数组排序sort($arr)

时间函数

函数描述示例
date()格式化日期时间date("Y-m-d H:i:s") → "2024-01-01 12:00:00"
time()获取当前时间戳time() → 1609459200
strtotime()将字符串转换为时间戳strtotime("2024-01-01") → 1609459200
mktime()创建时间戳mktime(0, 0, 0, 1, 1, 2024) → 1609459200

8.6 递归函数(简单了解)

递归函数的概念

递归函数是指在函数内部调用自身的函数。

示例:计算阶乘

php
<?php
function factorial($n) {
    if ($n <= 1) {
        return 1;
    }
    return $n * factorial($n - 1);
}

echo factorial(5); // 输出 120 (5 × 4 × 3 × 2 × 1)
?>

示例:斐波那契数列

php
<?php
function fibonacci($n) {
    if ($n <= 1) {
        return $n;
    }
    return fibonacci($n - 1) + fibonacci($n - 2);
}

// 输出前 10 个斐波那契数
for ($i = 0; $i < 10; $i++) {
    echo fibonacci($i) . " ";
}
// 输出:0 1 1 2 3 5 8 13 21 34
?>

注意事项

  • 递归函数必须有终止条件,否则会导致无限递归
  • 递归函数可能会消耗较多的内存,对于大规模计算可能不如迭代效率高

8.7 实操:封装常用工具函数

创建 functions-demo.php 文件

php
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>函数示例</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        .section {
            margin: 20px 0;
            padding: 15px;
            border: 1px solid #ccc;
            border-radius: 5px;
        }
        h2 {
            color: #333;
        }
        pre {
            background-color: #f5f5f5;
            padding: 10px;
            border-radius: 3px;
        }
    </style>
</head>
<body>
    <h1>函数示例</h1>
    
    <?php
    // 封装常用工具函数
    
    /**
     * 计算两个数的和
     * @param int $a 第一个数
     * @param int $b 第二个数
     * @return int 两数之和
     */
    function add($a, $b) {
        return $a + $b;
    }
    
    /**
     * 计算两个数的差
     * @param int $a 被减数
     * @param int $b 减数
     * @return int 两数之差
     */
    function subtract($a, $b) {
        return $a - $b;
    }
    
    /**
     * 计算两个数的积
     * @param int $a 第一个数
     * @param int $b 第二个数
     * @return int 两数之积
     */
    function multiply($a, $b) {
        return $a * $b;
    }
    
    /**
     * 计算两个数的商
     * @param int $a 被除数
     * @param int $b 除数
     * @return float 两数之商
     */
    function divide($a, $b) {
        if ($b == 0) {
            return "错误:除数不能为零";
        }
        return $a / $b;
    }
    
    /**
     * 格式化日期
     * @param string $format 日期格式
     * @param int $timestamp 时间戳
     * @return string 格式化后的日期
     */
    function formatDate($format = "Y-m-d H:i:s", $timestamp = null) {
        if ($timestamp === null) {
            $timestamp = time();
        }
        return date($format, $timestamp);
    }
    
    /**
     * 生成随机字符串
     * @param int $length 字符串长度
     * @return string 随机字符串
     */
    function generateRandomString($length = 10) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        return $randomString;
    }
    
    /**
     * 检查邮箱格式是否正确
     * @param string $email 邮箱地址
     * @return bool 是否为有效邮箱
     */
    function isValidEmail($email) {
        return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
    }
    
    // 测试函数
    echo '<div class="section">';
    echo '<h2>数学函数</h2>';
    echo "5 + 3 = " . add(5, 3) . '<br>';
    echo "5 - 3 = " . subtract(5, 3) . '<br>';
    echo "5 × 3 = " . multiply(5, 3) . '<br>';
    echo "5 ÷ 3 = " . divide(5, 3) . '<br>';
    echo "5 ÷ 0 = " . divide(5, 0) . '<br>';
    echo '</div>';
    
    echo '<div class="section">';
    echo '<h2>日期函数</h2>';
    echo "当前时间:" . formatDate() . '<br>';
    echo "只显示日期:" . formatDate("Y-m-d") . '<br>';
    echo "只显示时间:" . formatDate("H:i:s") . '<br>';
    echo '</div>';
    
    echo '<div class="section">';
    echo '<h2>字符串函数</h2>';
    echo "随机字符串:" . generateRandomString() . '<br>';
    echo "长度为 20 的随机字符串:" . generateRandomString(20) . '<br>';
    echo '</div>';
    
    echo '<div class="section">';
    echo '<h2>验证函数</h2>';
    echo "zhangsan@example.com 是否有效:" . (isValidEmail("zhangsan@example.com") ? '是' : '否') . '<br>';
    echo "invalid-email 是否有效:" . (isValidEmail("invalid-email") ? '是' : '否') . '<br>';
    echo '</div>';
    
    // 递归函数示例
    echo '<div class="section">';
    echo '<h2>递归函数</h2>';
    
    function factorial($n) {
        if ($n <= 1) {
            return 1;
        }
        return $n * factorial($n - 1);
    }
    
    echo "5 的阶乘:" . factorial(5) . '<br>';
    echo "10 的阶乘:" . factorial(10) . '<br>';
    echo '</div>';
    ?>
</body>
</html>

访问页面

  1. 将文件保存到网站根目录
  2. 打开浏览器,访问 http://localhost/functions-demo.php
  3. 查看页面效果

小结

通过本章的学习,你掌握了 PHP 函数的基本概念和使用方法,包括自定义函数的定义和调用、参数传递、返回值、变量作用域以及常用的系统函数。你还了解了递归函数的基本原理和应用。函数是 PHP 编程的重要组成部分,它可以将代码模块化,提高代码的复用性和可维护性。在后续的学习中,你将经常使用函数来组织和管理代码。

© 2026 编程马·菜鸟教程 版权所有