gpt4 book ai didi

php 关闭 : what to do next with it?

转载 作者:行者123 更新时间:2023-12-02 04:55:07 24 4
gpt4 key购买 nike

我有一些简单的例子:

function func1(){
return function (){
return 1;
};
}

但我不清楚如何出于我的原因使用它。似乎 func1() 返回与匿名函数相同的结果。但是如果我这样写:

echo func1();

...我得到一个错误:

Catchable fatal error: Object of class Closure could not be converted to string in [file_name] on line [line]

除了一个闭包对象,我什么也得不到:

var_dump(func1());
---------------------
object(Closure)[1]

但是我看不到它的实际用途。无论匿名函数返回什么,它始终包含相同的对象 - object(Closure)[1]。(我用的是php 5.3.3)此外,我看不出有什么方法可以存储匿名函数在 func1() 中返回的值。正如我所见,它无论如何都是一个封闭对象。但是如何在那里及以后使用它呢?

最佳答案

在您的示例中,调用 func1 的返回值是一个函数(更具体地说,是一个 Closure)。您收到的错误是由于 php 无法将此对象转换为字符串。如果你想打印闭包返回的值,你需要调用它。

function func1() {
return function () {
return 1;
};
}

$f = func1(); // Create the closure
echo $f(); // Calls the closure

这个例子只是一个返回函数的函数,并没有展示闭包与任何其他一流函数的区别,即闭包可以包含其创建时唯一的状态。换句话说,您可以从相同的代码生成函数,但它们可以访问的数据不同。

考虑这个简单的例子:

 function multiplier($m) {
return function ($v) use ($m) {
return $v * $m;
};
}

$mult_5 = multiplier(5);
echo $mult_5(5); // prints 25

$mult_10 = multiplier(10);
echo $mult_10(5); // prints 50

同样,这是一个非常微不足道的例子,但它确实展示了一些重要的事情。首先,我们只定义了一个函数,但通过调用这个函数,只需更改调用时的参数,就可以生成两个相似但不同的函数。另外,请考虑每个函数都有自己的“状态”。对于我命名为 $mult_5 的函数,它知道它自己的内部 $m 值为 5,这与$mult_10 函数的 $m 值。其中每一个的值都传递给了 multiplier 函数并且该函数已经完成,但该值仍然存在于返回的函数/闭包中。

还值得注意的是,调用multiplier 的每个返回值都是一级函数,这意味着您可以编写通用函数(如multiplier),然后使用它们可以“即时”生成更具体的功能,这些功能更适合您程序的当前环境/状态。

如果您熟悉 OOP,可以使用 OOP 轻松重写上面的示例:

class Multiplier {

protected $m;

public function __construct($m) {
$this->m = $m;
}

public function multiply($v) {
return $v * $this->m;
}
}

$mult_5 = new Multiplier(5);
echo $mult_5->multiply(5); // prints 25

$mult_10 = new Multiplier(10);
echo $mult_10->multiply(5); // prints 50

... 而且,这是非常主观的,但我更喜欢更简洁的闭包语法。

或者,您可以使用更通用的函数作为开始:

function multiplier($a, $b) {
return $a * $b;
}

echo multiplier(5, 5);
echo multiplier(5, 10);

但是使用闭包的好处是您可以隐藏数据(如本例中的乘数)。

关于php 关闭 : what to do next with it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18132483/

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