PHP中preg_replace_callback的use子句变量异常问题排查与解决
preg_replace_callback回调变量异常问题的原因与修复
在使用preg_replace_callback的回调函数时出现异常:预期将字符串每个字符替换为递增序号,同时生成替换映射表,但实际每次回调中$i始终回到3,$map始终为空。
问题代码
$i = 2; $map = []; $token = preg_replace_callback( '~\w~', function($matches) use($map, $i) { $i += 1; $map[$i] = $matches[0]; print "$i "; return $i; }, '$token' ); print_r($map); print "\n$token";
实际输出
3 3 3 3 3 Array ( ) $33333
问题原因
PHP中use关键字默认以值传递方式捕获外部变量,回调函数每次执行时都会创建$map和$i的独立副本,而非直接操作外部原始变量:
- 每次回调时,副本
$i的初始值都是外部的2,加1后固定为3; - 副本
$map始终是空数组,修改后不会同步到外部的$map。
修复方案
将use中的变量改为引用传递,在变量前加&符号,让回调函数直接操作外部原始变量:
$i = 2; $map = []; $token = preg_replace_callback( '~\w~', function($matches) use(&$map, &$i) { $i += 1; $map[$i] = $matches[0]; print "$i "; return $i; }, '$token' ); print_r($map); print "\n$token";
预期输出
3 4 5 6 7 Array ( [3] => t [4] => o [5] => k [6] => e [7] => n ) $34567
内容的提问来源于stack exchange,提问作者zzmaster
相关产品推荐
相关产品推荐

