【Laravel-海贼王系列】第十七章,Laravel 那些骚操作

栏目: PHP · 发布时间: 5年前

// 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:)
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Essential ActionScript 3.0

Essential ActionScript 3.0

Colin Moock / Adobe Dev Library / June 22, 2007 / $34.64

ActionScript 3.0 is a huge upgrade to Flash's programming language. The enhancements to ActionScript's performance, feature set, ease of use, cleanliness, and sophistication are considerable. Essentia......一起来看看 《Essential ActionScript 3.0》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具