PHP 函数引用参数与闭包的交互
简介
PHP 允许函数以引用方式传递参数。这允许函数修改传递的参数,而不是传递副本。闭包,即匿名函数,可以在函数引用参数上下文中使用。这允许闭包操纵传递给外部函数的参数。
引用参数
立即学习“PHP免费学习笔记(深入)”;
当一个参数以引用方式传递时,在函数内对它的修改也会修改调用方的原始变量。这是通过使用 & 符号来实现的。
function change_by_reference(&$number) {
$number++;
}
在调用此函数时,$number 参数以引用方式传递:
$number = 10;
change_by_reference($number);
echo $number; // 输出:11
与闭包交互
闭包可以访问函数引用参数。这意味着闭包可以修改或操纵这些参数。
function create_closure_with_reference($array) {
return function() use (&$array) {
// 访问并修改引用参数
$array[] = 5;
};
}
在调用 create_closure_with_reference 函数时,传递一个数组:
$array = [];
$closure = create_closure_with_reference($array);
$closure();
var_dump($array); // 输出:[0 => 5]
实战案例
考虑一个计算购物篮总价的函数,其中每个项目都有一个数量和价格。
function calculate_total($items) {
$total = 0;
foreach ($items as &$item) {
// 以引用方式修改物品的数量
$item['quantity']--;
// 累加总价
$total += $item['quantity'] * $item['price'];
}
return $total;
}
调用此函数时,$items 数组以引用方式传递,这样函数可以修改每个项目的数量:
$items = array(
array('name' => 'Item 1', 'quantity' => 2, 'price' => 10),
array('name' => 'Item 2', 'quantity' => 3, 'price' => 15)
);
$total = calculate_total($items);
print_r($items); // 输出:Array ( [0] => Array ( [quantity] => 1 ) [1] => Array ( [quantity] => 2 ) )
echo $total; // 输出:45
通过引用方式传递参数至关重要,这样函数才能修改原始集合。否则,函数将创建集合的副本,修改副本对调用方的原始变量没有影响。