我有一些简单的例子:
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]
然而,我无法看到它的实际用途。无论匿名函数返回什么,它总是包含相同的对象 - 对象(Closure)[1]。
(我使用的是php 5.3.3)
此外,我认为无法存储匿名函数在func1()中返回的值。我认为它无论如何都是一个封闭的对象。但是如何在那里使用它?
答案 0 :(得分:4)
在您的示例中,对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
,这与{{1}的$m
值不同功能。每个值的值都传递给$mult_10
函数,该函数已经完成,但该值仍然存在于返回的函数/闭包中。
值得注意的是,对multiplier
的调用的每个返回值都是第一类函数,这意味着您可以编写通用函数(如multiplier
),然后使用它们生成更具体的函数'on-the-fly',更适合当前环境/程序状态的功能。
如果您熟悉OOP,可以使用OOP轻松重写上述示例:
multiplier
...而且,这是非常主观的,但我更喜欢闭包的更多consice语法。
或者,您可以使用更常规的功能开始:
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
但是使用闭包的好处是你可以隐藏数据(比如本例中的乘数)。
答案 1 :(得分:1)
当您将匿名函数用作array_filter()
等函数的参数时,它们将变得非常有用。 See here documentation here.
另外,尝试过这样做:
$x = func1();
echo $x();
如果是这样,您的结果将取决于您如何定义func1
。