参考资料:
Laravel Service Provider 中 boot 办法和 register 办法的区别
php artisan 命令

new self 和new static

new self() 返回的是self所在类
new static() 返回调用者所在类
class Father{    public function getSelf(){        return new self();    }    public function getStatic(){        return new static();    }}$f = new Father();echo get_class($f->getSelf());//Fatherecho get_class($f->getStatic());//Fatherclass Son extends Father{}$s = new Son();echo get_class($s->getSelf());//Fatherecho get_class($s->getStatic());//Son

加载并启动ServiceProvider

boot和register办法的区别

register办法是必须的,boot办法不是
register 办法用于绑定服务到容器,框架会先调用所有 provider 的 register 办法,等所有服务都注册结束再去调用每一个服务的 boot 办法。所以不能在 register 办法外面调用其余 provider 提供的服务,因为咱们无奈保障其余服务曾经注册结束。而在 boot 办法外面你能够干任何事件!

dispatch和提早加载

提早加载

开启提早加载

vim FamilyServiceProvider.php
$defer = true;public function providers(){    return ['Family'];}
除编译生成的文件(optimize的反向操作)
php artisan clear-compiled
调用
app('Family')->test();//没有providers()时的调用办法app('App\Service\Family\FamilyService')->test();//providers()办法等价于app('app')->bind('Family','App\Service\Family\FamilyService');

源码

vim Illuminate/Foundation/Application.php
public function make($abstract, array $parameters = []){    $abstract = $this->getAlias($abstract);    if (isset($this->deferredServices[$abstract]) && ! isset($this->instances[$abstract])) {        $this->loadDeferredProvider($abstract);    }}

事件和监听者

观察者模式

观察者模式可能便当的创立查看指标对象状态的对象,并且提供与外围对象非耦合的指定性功能。

为软件增加由某个动作或状态变动激活的,然而涣散耦合的新性能时,该当创立基于观察者模式的对象。

模仿创立订单时发送短信邮件

非观察者模式
class order{    public function add(){        $a = new Message();$a->send();        $b = new Email();$b->send();    }}class Message{    public function send(){        echo '发送短信';    }}class Email{    public function send(){        echo '发送邮件';    }}$order = new Order();$order->add();//发送短信发送邮件
观察者模式
<?php//被观察者接口interface Observable{    function add(Observe $observe);//新增观察者    function del(Observe $observe);//删除观察者}class order implements Observable{    private $instance = array();    public function add(Observe $observe){        if(array_search($observe, $this->instance) === false){            $this->instance[] = $observe;        }    }    public function del(Observe $observe){        if($key = array_search($observe, $this->instance) !== false){            unset($this->instance[$key]);        }    }    public function notify(){        foreach ($this->instance as $observe){            $observe->send();        }    }}//观察者interface Observe{    function send();}class Message implements Observe{    public function send(){        echo '发送短信';    }}class Email implements Observe{    public function send(){        echo '发送邮件';    }}$order = new Order();$order->add(new Message());$order->add(new Email());$order->notify();//发送短信发送邮件

如果再想发送钉钉揭示,则只须要实现Observe接口类即可

class DingTalk implements Observe{    public function send(){        echo '发送钉钉揭示';    }}$order = new Order();$order->add(new DingTalk());$order->notify();//发送钉钉揭示

创立事件和监听者

创立事件和监听者

php artisan make:event EventTestphp artisan make:listener EventTestListenerphp artisan make:listener OtherListener

注册事件和监听者

vim app/Providers/EventServiceProvider.php
'App\Events\EventTest' => [    'App\Listeners\EventListener',    'App\Listeners\OtherListener',],

调用事件

event(new EventTest());