贴一段在知乎上看到的代码, 想了很久还是没想通, 求大神通俗讲解:
<?php
namespace App;
interface Middleware
{
public function handle($next);
}
class Session implements Middleware
{
public function handle($next)
{
echo "<br/>Session Start<br/>";
$next();
echo "<br/>Session End<br/>";
}
}
class Mysql implements Middleware
{
public function handle($next)
{
echo "<br/>Mysql Start<br/>";
$next();
echo "<br/>Mysql end<br/>";
}
}
function run($next, $step)
{
return function () use ($next, $step) {
call_user_func_array([new $step, 'handle'], [$next]);
};
}
$class = [Session::class, Mysql::class];
$callback = array_reduce($class, 'App\run', function () {});
$callback();
运行结果
Mysql Start
Session Start
Session End
Mysql end
请输入代码
跟下面这个问题一样,不重复写了。
https://segmentfault.com/q/10...
首先是这样的.我们看下面的代码来理解一下
上面的结果为50.那么它的过程是怎么样的呢?我们对代码进行改良
然后可以看到如下输出
第一个v1 = 5,v2 = 10;
第二个v1 = 15 (前一个返回的值) , v2 = 15; $a[1]的值;
第三个v1 = 30 (上一次的返回值) , v2 = 20; $a[2]的值;
现在回答题主的问题:
上面的这个例子
myfunction
返回的是一个数值,但是题主的问题run
方法返回的是一个function
,这一点很重要。现在我们把
array_reduce($class, 'App\run', function () {});
第三个函数看作是A
。现在按照array_reduce方法的原理开始执行
第一步run(A, Session::class),返回
新
函数B
(特别重要,run方法知识返回一个函数,函数并不会执行)第二步run(B, Mysql::class),返回
新
函数C
(此时函数C会赋值给$callback
)array_reduce函数执行完毕最终返回的就是函数C,最后一行代码
$callback();
就是执行函数C。现在开始反推
好了故事编完了。