// Pipeline 的调用逻辑
$response = method_exists($pipe, $this->method)
? $pipe->{$this->method}(...$parameters)
: $pipe(...$parameters);
// Events 的封装
return function ($event, $payload) use ($listener, $wildcard) {
if ($wildcard) {
return $listener($event, $payload);
}
return $listener(...array_values($payload));
};
... 的用法可以理解成解构后面的数组按照顺序传递给调用的方法。
// 皮一下:如果数组的 key 不是数字会如何?
抛出异常:Cannot unpack array with string keys
复制代码
【coquettish two】 - 事件的骚操作
真香用法:app('events')->listen('sao',[$obj,'fuck']);
// 事件对应的封装源码
return function ($event, $payload) use ($listener = [$obj,'fuck'], $wildcard) {
if ($wildcard) {
return $listener($event, $payload);
}
// 此处是最终调用
return $listener(...array_values($payload));
};
// 最终调用变成
[$obj,'fuck'](...array_values($payload));
// 等价代码
call_user_func_array([$obj,'fuck'],...array_values($payload));
复制代码
【coquettish three】 - ArrayAccess 对象用数组访问
普通的代码: app('events'); // 从容器中获取事件对象
骚操作: app()['events']; // 调用容器的offsetGet方法
public function offsetGet($key)
{
return $this->make($key); // make一个events对象
}
复制代码
-
容器实现了
ArrayAccess接口,按照数组方式访问对象的时候会触发 PHP 指定的方法。详细:ArrayAccess
【coquettish four】 - 容器 bind-make 一些不为人知的秘密
一个常规的用法分析
app()->bind('myclass',function(){reutrn 'test';});
dump(app('myclass')); // 输出 'test';
还可以
app()->bind('myclass',function($app){return $app;});
dump(app('myclass')); // 输出 Application#2 对象
还可以
app()->bind('myclass',function($app,$param){return $param;});
dump(app()->makeWith('myclass',['hhh'=>'vvv']); // 输出 ['hhh'=>'vvv']
直接看容器如何 make 一个绑定闭包的返回:
if ($concrete instanceof Closure) {
return $concrete($this, $this->getLastParameterOverride());
}
可以看到容器直接执行闭包并返回。
实际执行:
第一个:(function($this, $this->getLastParameterOverride()){return 'test';})();
第二个:(fucntion($this, $this->getLastParameterOverride()){return $this;})();
第三个:(fucntion($this, $this->getLastParameterOverride()){return $this->getLastParameterOverride();})();
...
思考:三个闭包分别声明了【零个,一个,两个】参数但是容器中执行的时候总是传入两个参数,PHP会自动忽略多余的参数。
如果闭包再多声明一个参数? (直接:boom:)
复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【Laravel-海贼王系列】第八章, Provider 功能解析
- 【Laravel-海贼王系列】第十四章,Session 解析
- 【Laravel-海贼王系列】第十二章,Facade 模式解析
- 【Laravel-海贼王系列】第十章,Job&队列存储端实现
- 【Laravel-海贼王系列】第十三章,路由&控制器解析
- 慢雾安全 海贼王:从DApp亡灵军团,细说区块链安全
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java 8函数式编程
[英] Richard Warburton / 王群锋 / 人民邮电出版社 / 2015-3 / 39.00元
通过每一章的练习快速掌握Java 8中的Lambda表达式 分析流、高级集合和其他Java 8类库的改进 利用多核CPU提高数据并发的性能 将现有代码库和库代码Lambda化 学习Lambda表达式单元测试和调试的实践解决方案 用Lambda表达式实现面向对象编程的SOLID原则 编写能有效执行消息传送和非阻塞I/O的并发应用一起来看看 《Java 8函数式编程》 这本书的介绍吧!