Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php闭包:下一步该怎么做?_Php_Oop_Closures_Anonymous Function - Fatal编程技术网

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

php闭包:下一步该怎么做?,php,oop,closures,anonymous-function,Php,Oop,Closures,Anonymous Function,我有一些简单的例子: 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]

我有一些简单的例子:

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]。 (我使用PHP5.3.3)
此外,我看不到在func1()中存储匿名函数返回的值的方法。在我看来,它是一个closuer对象。但是如何使用它呢?

当您将匿名函数用作
array\u filter()等函数的参数时,它们会变得非常有用

此外,您也尝试过这样做:

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

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

在您的示例中,调用
func1
的返回值是一个函数(更具体地说,是一个
闭包
)。您得到的错误是由于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
值不同。每个函数的值都被传递给
乘数
函数,该函数已完成,但该值仍保留在返回的函数/闭包中

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

如果您熟悉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);

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

这一个不是很有用,但其他的可能是:
函数make_adder($x){return function($y)use($x){return$x+$y;}}
让你做一些类似于
$adder=make_adder(3)的事情;echo$加法器(2);//打印5
。上述示例可用于函数,这非常有用。建议您花些时间使用功能性更强的语言,这将使您更好地了解如何使用函数式编程。然后回到PHP,你会发现新的闭包、匿名函数和现在更有用的回调数组函数更有用。我想他是在问闭包的实际用途是什么,但他没有正确地应用闭包。老实说,我没有大学文凭,所以不了解闭包,但是我仍然可以使用它们在PHP和jQuery中使用很多有用的东西这确实填补了我对这个问题理解的空白。现在我正在读一本相当不错的书(叫做Php.Pro.Programming),但这一点在那里解释得相当糟糕:(你可能更了解某本书吗?