gpt4 book ai didi

php - 为什么我应该将我的函数分配给一个变量?

转载 作者:行者123 更新时间:2023-12-05 02:10:19 24 4
gpt4 key购买 nike

在阅读 Anonymous functions entry 时在 php.net 上,查看提供的示例,我看到了这一部分,其中提到了这些函数的第二个用例:

Closures can also be used as the values of variables.

我想知道为什么要将方法分配给变量?我在这里想了解的是这种方法的优势:

$greet = function($name)
{
echo "Hello $name";
};

$greet('World');
$greet('PHP');

像这样的一段:

function greet($name) 
{
echo "Hello $name";
}
greet('World');
greet('PHP');

这证明了?它只是编写一段代码的另一种方法吗?或者,在某些情况下,在更高级的设计中,它会为更具描述性的代码库留出空间?

最佳答案

这是个好问题。匿名函数的问题在于它们通常应该是匿名的。当你将它们分配给一个变量时,你给它们起了一个名字,这违背了目的。

在一个简单的示例中,它们的工作方式与命名函数相同:

function named($a) {
echo 'This is '.$a;
}

$unnamed = function ($a) {
echo 'This is '.$a;
};

function caller($callee, string $name) {
$callee($name);
}

caller('named', 'named');
caller($unnamed, 'unnamed');

唯一的区别是$callee的类型一次是字符串,一次是函数。

区别:

假设您有这样一种场景,您希望将当前作用域捕获到一个函数中,并将其传递给另一个函数以作为回调执行。

$v1 = 2;
$a = function() use($v1) { return $v1; };
// or
$a = fn() => $v1;
$v1 = 4;

function named($callback) {
$v1 = 3;
echo $callback();
}

named($a); //output is 2

对于普通函数,您必须将值作为参数传递给函数。在调用函数时值已经改变,这意味着您需要在定义函数时自己捕获值。

您可以将闭包分配给变量这一事实并不意味着您必须这样做。这意味着该函数可以作为 first-class citizen 传递.

例如,考虑这段代码,它捕获 B 类中的私有(private)属性并将其在闭包内部传递给 A 类:

class A {
private $someVar = 'Hello world!';

public function __construct($callback) {
$callback();
}
}

class B {
private $someVar = 'Bogus!';

public function createCallback() {
return function () {
echo $this->someVar;
};
}
}

$b = new B();
new A($b->createCallback()); // echo Bogus!

关于php - 为什么我应该将我的函数分配给一个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58881603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com