个性化阅读
专注于IT技术分析

如何在PHP的闭包函数中更改范围之外的变量的值

你使用过多少次未设计的工具?很难计数不是吗?有时使用非常复杂的PHP库, 但同时又不能满足你的所有要求, 因此在满足这些要求时会遇到问题。闭包是一个单独的命名空间, 通常情况下, 你无法访问此命名空间之外定义的变量。这就是use关键字的来源, 它使范围之外的变量在闭包内部可用, 例如:

<?php

function some_function_that_expect_closures($callback){
    if (is_callable($callback)) {
        $returnValue = call_user_func($callback);
    }
	
	return $returnValue;
}

$variableOutside = array(
    "a" => 1, "b" => 2
);

$returnedValue = some_function_that_expect_closures(function() use ($variableOutside){
	// array(2) { ["a"]=> int(1) ["b"]=> int(2) }
	var_dump($variableOutside);
	
	return "Hello World";
});

// string(11) "Hello World"
var_dump($returnedValue);

使用闭包的库中最常见的问题之一是, 初学者无法从PHP闭包的范围之外更新变量的值, 例如:

<?php

function libraryWithCallback($callback){
    if (is_callable($callback)) {
        $argument = "cheese";
        
        $returnValue = call_user_func($callback, $argument);
    }
}


$myVariable = "nachos";

libraryWithCallback(function($newValue) use ($myVariable){
    // Assign "cheese" tovariable
    $myVariable = $newValue;
});

// Prints "nachos"
echo $myVariable;

上一个代码片段的目标是通过回调函数(闭包)简单地更改$ myVariable的值。 PHP的初学者只会认为$ myVariable的值现在是” cheese”, 但这不是由于闭包的工作方式引起的。

在闭包内更改变量的值

听起来很简单, 你可以通过在闭包外更改变量的值, 方法是将其作为引用传递, 而不是在use语句中的变量前加上&并将其作为副本(使变量在闭包内可用)。如PHP的官方文档所示, 通过引用传递变量的语法如下:

<?php

function foo(&$var)
{
    $var++;
}

$a = 5;

foo($a);

// $a is 6 here

因此, 在我们的闭包内部示例中, 你可以简单地在外部更新变量的值, 使其在使用范围内可用, 并将其通过引用前缀&传递给变量:

<?php

function libraryWithCallback($callback){
    if (is_callable($callback)) {
        $argument = "cheese";
        
        $returnValue = call_user_func($callback, $argument);
    }
}


$myVariable = "nachos";

libraryWithCallback(function($newValue) use (&$myVariable){
    // Assign "cheese" tovariable
    $myVariable = $newValue;
});

// Prints "cheese"
echo $myVariable;

请注意, 可以在闭包内分配任何值(不仅是标量值)而不会出现问题。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在PHP的闭包函数中更改范围之外的变量的值

评论 抢沙发

评论前必须登录!