Php 为什么我要将函数赋给变量?

Php 为什么我要将函数赋给变量?,php,anonymous-function,Php,Anonymous Function,在php.net上阅读时,我看到了提供的示例,这一节提到了这些函数的第二个用例: 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,

在php.net上阅读时,我看到了提供的示例,这一节提到了这些函数的第二个用例:

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');
闭包也可以用作变量的值

我想知道为什么要给变量指定一个方法?我想了解的是,这种方法的优势是什么:

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

$greet('World');
$greet('PHP');
在这样的作品上:

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

这是合理的吗?这只是编写一段代码的另一种方式吗?或者,在某些情况下,在更高级的设计中,它将为更具描述性的代码库提供空间。

您可以在HEREDOC字符串中使用“变量分配”函数:

愚蠢(未经测试)示例:

$mult=function($n){return$n*2;}
$x=5;

$str=这是个好问题。匿名函数的问题是它们通常应该是匿名的。当你把它们赋给一个变量时,你给了它们一个名字,这就违背了它的目的

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

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
对于普通函数,必须将值作为参数传递给函数。调用函数时,值已更改,这意味着您需要在定义函数时自己捕获值

可以为变量指定闭包并不意味着必须这样做。这意味着函数可以作为一个函数传递

以这段代码为例,它捕获
B
类中的私有属性,并在闭包内部将其传递给
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!

您可以在“映射”中使用它们为值赋予函数
$map=array(1=>function(){return“first one”;});echo$map[1]()。通过将函数声明为变量,只需将该变量重新指定给其他函数,即可更改执行流,而无需更改代码。如果我有一个函数希望有一个全局命名的变量用作回调,那么我现在可以在执行之前修改这个全局变量来更改函数的行为。你也可以对普通的命名函数执行同样的操作。我已经尝试过了,并且发现了错误。还有内置的功能。实际上,我有一个变量包装函数,它返回您传递给它的任何内容,用于在HEREDOC Strings中使用函数的明确目的。您的测试在该链接上不起作用。它回显“{mult(5)}”,您的变量包含函数。在我的示例中,变量包含函数名。@Dharman不要误解我的意思-我喜欢你的答案;但这也是完全合法的使用。我基本上可以通过任何参数动态地传入我喜欢的任何函数。