繁体   English   中英

php关闭:下一步该怎么做?

[英]php Closure: what to do next with it?

我有一个简单的例子:

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()中返回的值。 如我所见,它仍然是一个closuer对象。 但是如何在其他地方使用它呢?

在您的示例中,对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);

但是,改用闭包的好处是您可以隐藏数据(在此示例中为乘法器)。

当您将匿名函数用作诸如array_filter()类的函数的参数时,匿名函数将变得很有用。 请参阅此处的文档。

另外,尝试这样做:

$x = func1();
echo $x();

如果是这样,结果将取决于您如何定义func1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM