第7页 / 共40页

函数定义与作用域

函数是组织好的、可重复使用的代码块。它让程序模块化,避免代码冗余。本页详细讲解 PHP 函数的参数传递、强类型约束、返回值以及变量作用域的规则。

一、函数的定义与调用

PHP 中的函数使用关键字 function 声明。函数名遵循与变量相同的命名规则,但不需要 $ 符号。

<?php // 定义一个无参数无返回值的函数 function sayHello() { echo "你好,惜梦!"; } // 调用函数 sayHello(); // 输出:你好,惜梦!

函数名不区分大小写,但强烈建议按照定义时的名字调用。PHP 不支持函数重载(不能定义两个同名函数),也不能在定义函数前调用它(除非是有条件定义的函数)。

二、参数传递详解

1. 值传递 (默认)

默认情况下,PHP 将参数的"副本"传递给函数。函数内部修改参数,不会影响外部的原始变量。

<?php function addTen($num) { $num += 10; echo "内部值: {$num}\n"; } $val = 5; addTen($val); echo "外部值: {$val}"; /* 输出: 内部值: 15 外部值: 5 */

2. 引用传递 (&)

如果希望函数能直接修改外部的变量,需在参数前加 & 符号。

<?php function addTenRef(&$num) { $num += 10; } $val = 5; addTenRef($val); echo "外部值: {$val}"; // 输出:外部值: 15

3. 默认参数与可变参数

<?php // 默认参数:必须放在参数列表的右侧 function greet($name, $greeting = "你好") { echo "{$greeting},{$name}!"; } greet("惜梦"); // 输出:你好,惜梦! greet("PHP", "欢迎学习"); // 输出:欢迎学习,PHP! // 可变参数 (PHP 5.6+ 的 ... 语法) function sumAll(...$nums) { return array_sum($nums); } echo sumAll(1, 2, 3, 4); // 输出:10

三、返回值与强类型约束

函数通过 return 语句返回结果。一旦执行 return,函数立即终止。现代 PHP 强烈建议声明参数和返回值的类型,以减少运行时错误。

<?php // 声明参数必须是 int,返回值必须是 float function divide(int $a, int $b): float { if ($b === 0) { throw new Exception("除数不能为零"); } return $a / $b; } try { echo divide(10, 3); // 输出 3.333... } catch(Exception $e) { echo "错误: " . $e->getMessage(); }

PHP 8.0+ 命名参数

PHP 8 允许通过参数名传递值,这极大地提升了代码可读性,并允许跳过有默认值的中间参数。

<?php function createUser(string $name, bool $isAdmin = false, bool $isActive = true) { // ... } // 传统写法:只想改 isActive,必须把 isAdmin 也写上 createUser("惜梦", false, false); // PHP 8 写法:直接指定参数名 createUser(name: "惜梦", isActive: false);

四、变量作用域

作用域决定了变量在何处可以被访问。PHP 具有三种主要的作用域:局部、全局和静态。

1. 局部作用域

在函数内部声明的变量,仅能在函数内部访问。函数执行完毕后,局部变量会被销毁。

2. 全局作用域

在所有函数外部声明的变量。注意:函数内部默认无法直接访问全局变量

<?php $globalVar = "我是全局变量"; function testScope() { // echo $globalVar; // 报错!无法直接访问 global $globalVar; // 使用 global 关键字引入 echo $globalVar; // 正常输出 } testScope();

除了 global 关键字,还可以使用超全局数组 $GLOBALS['globalVar'] 访问。但在现代面向对象开发中,应尽量避免使用全局变量,而是通过函数参数传递数据。

3. 静态作用域

当一个函数执行完毕后,其局部变量通常会被销毁。如果希望某个局部变量在函数多次调用间保持上一次的值,使用 static 关键字声明。

<?php function counter() { static $count = 0; // 仅在第一次调用时初始化为 0 $count++; echo "调用次数: {$count}\n"; } counter(); // 输出:调用次数: 1 counter(); // 输出:调用次数: 2 counter(); // 输出:调用次数: 3

五、PHP 7.4+ 箭头函数

箭头函数是匿名函数的简写形式,支持自动从父作用域捕获变量,非常适合用于回调函数(如 array_map)。

<?php $factor = 10; // 传统匿名函数:需要手动 use 捕获外部变量 $oldFn = function($n) use ($factor) { return $n * $factor; }; // 箭头函数:自动捕获 $factor,且只能写一行表达式 $arrowFn = fn($n) => $n * $factor; echo $arrowFn(5); // 输出:50