php匿名函数用function关键字定义,无函数名,可赋值、传参或立即调用;支持use导入外部变量(引用需加&),常用于array_map/array_filter;php 7.4+新增短闭包fn() => ...仅限简单表达式。

PHP匿名函数怎么写,语法长什么样
PHP匿名函数就是没有名字的函数,用function关键字开头,后面不跟函数名,直接跟参数列表和函数体。它本身是个值,可以赋给变量、当参数传、甚至立刻调用。
- 必须用
function关键字,不能省略(PHP 8.1+也不支持箭头函数替代所有场景) - 参数列表和普通函数一样,支持默认值、类型声明、可变参数(
...$args) - 返回值靠
return,没写就返回null - 定义时不执行,只是创建一个
Closure对象
$greet = function($name) {
return "Hello, $name";
};
echo $greet("Alice"); // Hello, Alice
闭包怎么访问外部变量(use的作用)
匿名函数默认无法读写定义位置之外的变量。想用就得显式通过use导入——不是自动继承,也不是全局作用域查找。
-
use只导入当前作用域的变量副本,修改它不会影响原变量(除非加&引用) - 多个变量用逗号分隔:
use ($a, $b, &$counter) -
use里不能放表达式,只能是变量名;也不能放$this(类方法里要用$this得单独处理)
$message = "Hi";
$fn = function($name) use ($message) {
return "$message, $name!";
};
// $message变了,$fn里还是原来的"Hi"
在array_map/array_filter里直接用匿名函数行不行
完全可行,而且是常见用法。但要注意参数顺序和返回值逻辑,不然结果为空或报错。
-
array_map:匿名函数接收每个元素,必须有return,否则映射出null -
array_filter:函数返回true才保留该元素;不写return等价于return null→ 过滤掉全部 - PHP 7.4+支持短闭包语法(
fn($x) => $x * 2),但仅限简单表达式,不能有语句、不能use引用变量
$nums = [1, 2, 3];
$result = array_map(function($n) { return $n ** 2; }, $nums); // [1, 4, 9]
$evens = array_filter($nums, function($n) { return $n % 2 === 0; }); // [2]
闭包绑定$this或改变作用域时容易出什么错
Closure::bind和Closure::bindTo能强行把闭包绑定到某个对象或类作用域,但稍不注意就报错或行为异常。
立即学习“PHP免费学习笔记(深入)”;
- 绑定后才能在闭包里用
$this访问目标对象属性/方法;没绑定就用$this会触发Fatal error: Using $this when not in object context -
bindTo返回新闭包,原闭包不变;忘记接返回值就等于白绑 - 静态闭包(
static关键字声明)不能绑定实例,否则报Cannot bind an instance to a static closure
$obj = new stdClass();
$obj->value = 42;
$fn = function() { return $this->value; };
$bound = $fn->bindTo($obj);
echo $bound(); // 42
闭包的use和绑定是两套机制:前者抓变量快照,后者换$this上下文。混用时尤其要盯住变量来源和$this指向,调试时var_dump(get_class($fn))能看出是不是已绑定。











