You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP闭包内存占用更高的原因是什么?是否不推荐使用闭包?

嘿,我来帮你理清这个问题的来龙去脉~

为什么闭包占用更多内存?

咱们先从PHP里闭包和普通匿名函数的底层差异说起:

  • 你第一个例子里的static function ($add, $value)是无捕获的匿名函数,它本质上就是一个独立的函数对象,不需要维护任何外部上下文的变量,结构非常简洁,所以内存开销小。
  • 第二个例子里用use ($value)的闭包,PHP会创建一个Closure类的实例。这个实例不仅包含函数本身的代码,还需要封装它捕获的外部变量(也就是$value)到自身的内部状态中——相当于闭包对象要额外存储这些捕获的变量信息,哪怕你只是按值传递,也会有对应的内存开销来维护这个上下文环境。这就是为什么它的内存占用(752字节)比普通匿名函数(368字节)高的核心原因。

你提到对象也有同样情况,其实逻辑是类似的:对象本身需要存储属性、类信息等额外结构,比单纯的函数要占用更多内存,闭包作为一种特殊的对象(Closure实例),自然也遵循这个规律。

是否不推荐使用闭包?

绝对不能因为这点内存差异就否定闭包的价值!

  • 首先,你测试里的内存差异只有几百字节,在绝大多数日常开发场景中,这点开销完全可以忽略不计,不会对应用性能产生任何影响。
  • 其次,闭包的核心优势是可以捕获外部上下文变量,让代码更简洁、更符合函数式编程的风格,比如在处理回调函数、事件监听、函数柯里化、动态生成函数这些场景下,闭包能极大提升代码的可读性和灵活性,这些收益远大于那点内存开销。
  • 当然,如果你的代码运行在内存极度受限的环境(比如嵌入式PHP、超大规模并发的极端场景),且确实可以用普通函数替代闭包完成需求,那可以考虑优先用普通函数;但对于绝大多数业务开发来说,闭包依然是非常好用的工具。

最后附上你的测试代码方便参考:

测试代码1:普通匿名函数

$value = 10;
$memory = memory_get_usage();
$fun = static function ($add, $value) { $value += $add; echo $value; };
$fun(10, $value);
echo ' | ' . $value . ' | memory: ' . (memory_get_usage() - $memory);

输出: 20 | 10 | memory: 368

测试代码2:闭包(捕获变量)

$value = 10;
$memory = memory_get_usage();
$closure = static function (int $add) use ($value) { $value += $add; echo $value; };
$closure(10);
echo ' | ' . $value . ' | memory: ' . (memory_get_usage() - $memory);

输出: 20 | 10 | memory: 752

内容的提问来源于stack exchange,提问作者Jazi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:25:05