<返回目录     Powered by claud/xia兄

第5课: 函数与作用域

函数基础

函数是可重用的代码块,用于执行特定任务。PHP有大量内置函数,也支持自定义函数。

定义和调用函数

<?php
// 定义函数
function greet() {
    echo "Hello, World!";
}

// 调用函数
greet();  // 输出: Hello, World!

// 带参数的函数
function greetUser($name) {
    echo "Hello, $name!";
}

greetUser("张三");  // 输出: Hello, 张三!
?>

返回值

<?php
function add($a, $b) {
    return $a + $b;
}

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

// 返回多个值(使用数组)
function getUser() {
    return ["name" => "张三", "age" => 25];
}

$user = getUser();
echo $user["name"];  // 输出: 张三

// PHP 7.1+ 可以使用list解构
[$name, $age] = ["张三", 25];
?>

函数参数

默认参数值

<?php
function createUser($name, $role = "user", $active = true) {
    return [
        "name" => $name,
        "role" => $role,
        "active" => $active
    ];
}

$user1 = createUser("张三");  // 使用默认值
$user2 = createUser("李四", "admin");  // 覆盖role
$user3 = createUser("王五", "user", false);  // 覆盖所有
?>

类型声明(Type Hints)

<?php
// PHP 7+ 支持类型声明
function multiply(int $a, int $b): int {
    return $a * $b;
}

echo multiply(5, 3);  // 15
// multiply("5", "3");  // 严格模式下会报错

// 可空类型(PHP 7.1+)
function greet(?string $name): string {
    return $name ? "Hello, $name" : "Hello, Guest";
}

// 联合类型(PHP 8+)
function process(int|float $number): int|float {
    return $number * 2;
}
?>

可变参数(Variadic Functions)

<?php
// 使用...运算符接收任意数量参数
function sum(...$numbers) {
    $total = 0;
    foreach ($numbers as $num) {
        $total += $num;
    }
    return $total;
}

echo sum(1, 2, 3);        // 6
echo sum(1, 2, 3, 4, 5);  // 15

// 结合普通参数
function formatList($separator, ...$items) {
    return implode($separator, $items);
}

echo formatList(", ", "苹果", "香蕉", "橙子");  // 苹果, 香蕉, 橙子
?>

引用传递

<?php
// 默认是值传递
function increment($num) {
    $num++;
}

$x = 5;
increment($x);
echo $x;  // 5(未改变)

// 引用传递(使用&符号)
function incrementRef(&$num) {
    $num++;
}

$y = 5;
incrementRef($y);
echo $y;  // 6(已改变)

// 实际应用:交换两个变量
function swap(&$a, &$b) {
    $temp = $a;
    $a = $b;
    $b = $temp;
}
?>

变量作用域

局部作用域

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

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

全局作用域

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

function useGlobal() {
    // 方式1:使用global关键字
    global $globalVar;
    echo $globalVar;

    // 方式2:使用$GLOBALS数组
    echo $GLOBALS['globalVar'];
}

useGlobal();

// 修改全局变量
function modifyGlobal() {
    global $globalVar;
    $globalVar = "已修改";
}
?>

静态变量

<?php
function counter() {
    static $count = 0;  // 静态变量保持值
    $count++;
    echo $count . "\n";
}

counter();  // 输出: 1
counter();  // 输出: 2
counter();  // 输出: 3

// 实际应用:单例模式
function getConnection() {
    static $conn = null;
    if ($conn === null) {
        $conn = new PDO("mysql:host=localhost", "user", "pass");
    }
    return $conn;
}
?>

匿名函数(闭包)

基本匿名函数

<?php
// 将函数赋值给变量
$greet = function($name) {
    return "Hello, $name!";
};

echo $greet("张三");  // Hello, 张三!

// 作为回调函数
$numbers = [1, 2, 3, 4, 5];
$squared = array_map(function($n) {
    return $n * $n;
}, $numbers);

print_r($squared);  // [1, 4, 9, 16, 25]
?>

闭包与use关键字

<?php
$message = "Hello";

// 使用use引入外部变量
$greet = function($name) use ($message) {
    return "$message, $name!";
};

echo $greet("张三");  // Hello, 张三!

// 引用传递外部变量
$counter = 0;
$increment = function() use (&$counter) {
    $counter++;
};

$increment();
$increment();
echo $counter;  // 2
?>

箭头函数(PHP 7.4+)

<?php
// 简洁的箭头函数语法
$multiply = fn($a, $b) => $a * $b;
echo $multiply(5, 3);  // 15

// 自动捕获外部变量(不需要use)
$factor = 10;
$scale = fn($n) => $n * $factor;
echo $scale(5);  // 50

// 用于数组操作
$numbers = [1, 2, 3, 4, 5];
$doubled = array_map(fn($n) => $n * 2, $numbers);
?>

内置函数

常用字符串函数

<?php
$str = "Hello World";

strlen($str);           // 11 - 字符串长度
strtoupper($str);       // "HELLO WORLD"
strtolower($str);       // "hello world"
str_replace("World", "PHP", $str);  // "Hello PHP"
substr($str, 0, 5);     // "Hello"
strpos($str, "World");  // 6 - 查找位置
?>

常用数组函数

<?php
$arr = [1, 2, 3, 4, 5];

count($arr);            // 5 - 数组长度
array_push($arr, 6);    // 添加元素
array_pop($arr);        // 移除最后一个元素
array_sum($arr);        // 15 - 求和
array_reverse($arr);    // 反转数组
in_array(3, $arr);      // true - 检查元素是否存在
?>

常用数学函数

<?php
abs(-5);        // 5 - 绝对值
round(3.7);     // 4 - 四舍五入
ceil(3.2);      // 4 - 向上取整
floor(3.8);     // 3 - 向下取整
max(1, 5, 3);   // 5 - 最大值
min(1, 5, 3);   // 1 - 最小值
rand(1, 100);   // 随机数
pow(2, 3);      // 8 - 幂运算
sqrt(16);       // 4 - 平方根
?>

递归函数

<?php
// 计算阶乘
function factorial($n) {
    if ($n <= 1) {
        return 1;
    }
    return $n * factorial($n - 1);
}

echo factorial(5);  // 120

// 斐波那契数列
function fibonacci($n) {
    if ($n <= 1) {
        return $n;
    }
    return fibonacci($n - 1) + fibonacci($n - 2);
}

echo fibonacci(10);  // 55

// 遍历目录(递归)
function listFiles($dir) {
    $files = scandir($dir);
    foreach ($files as $file) {
        if ($file != '.' && $file != '..') {
            $path = $dir . '/' . $file;
            if (is_dir($path)) {
                listFiles($path);  // 递归调用
            } else {
                echo $path . "\n";
            }
        }
    }
}
?>

函数的高级特性

可变函数

<?php
function sayHello() {
    echo "Hello!";
}

function sayGoodbye() {
    echo "Goodbye!";
}

$func = "sayHello";
$func();  // 调用sayHello()

// 实际应用:动态调用
$action = $_GET['action'] ?? 'default';
$allowedActions = ['create', 'update', 'delete'];

if (in_array($action, $allowedActions)) {
    $functionName = $action . 'User';
    $functionName();  // 调用createUser()等
}
?>

回调函数

<?php
// 使用callable类型
function process(array $data, callable $callback) {
    $result = [];
    foreach ($data as $item) {
        $result[] = $callback($item);
    }
    return $result;
}

$numbers = [1, 2, 3, 4, 5];

// 使用匿名函数
$doubled = process($numbers, function($n) {
    return $n * 2;
});

// 使用内置函数
$strings = process($numbers, 'strval');
?>
最佳实践:

实践练习

  1. 基础函数:编写函数计算两个数的最大公约数
  2. 默认参数:创建函数生成HTML标签,支持默认属性
  3. 可变参数:编写函数计算任意数量数字的平均值
  4. 引用传递:编写函数对数组进行排序(修改原数组)
  5. 匿名函数:使用array_filter过滤数组中的偶数
  6. 递归函数:实现目录树的递归遍历
  7. 闭包应用:创建计数器函数(使用静态变量)
  8. 回调函数:实现自定义的数组排序函数