Laravel 5 IoC类型提示不起作用

sil*_*ire 5 php inversion-of-control laravel laravel-5

据我所知,我应该能够在我的类的构造函数中键入提示我的类实例参数,我只能在服务提供者的帮助下实例化.不幸的是我收到了关于缺少参数的错误.

Tracker.php

function __construct($query, Tracker\Shipment $shipment) {
    $this->query    = $query;
    $this->shipment = $shipment;
}
Run Code Online (Sandbox Code Playgroud)

TrackerServiceProvider.php

class TrackerServiceProvider extends \Illuminate\Support\ServiceProvider {
    public function register() {
        $this->app->bind('TrackerAPI',  function($app, $shipment_number) {
            return new Tracker\API($shipment_number); // omitting Shipment argument should resolve on its own?
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

类API正在扩展Tracker,因此使用其构造函数.如果没有隐含的类类型提示,它为什么不解析?

pat*_*cus 7

您已经new通过类型提示功能将PHP 功能与Laravel的依赖注入混淆了.

TrackerAPI绑定中,当您指定时return new Tracker\API($shipment_number);,PHP中没有内置任何内容来尝试充实任何缺少的参数.要做到这一点,你需要return $app->make('Tracker\API', [$shipment_number]);

当您使用该App::make()方法时,Laravel将发挥其魔力来创建一个新对象.它首先检查明确定义的绑定.如果它没有找到显式绑定,它将回退到仅使用提供的参数和类型提示的组合来为任何缺少的参数创建对象.

请采取以下声明:App::make('Tracker\API', [$shipment_number]).假设没有明确定义的绑定Tracker\API.该Tracker\API构造函数需要两个参数.$shipment_number在参数数组中传入,因此它将用作第一个参数.由于只提供了一个参数,因此Laravel将App::make()使用类型提示来完成其余参数.

但是,当您使用new关键字自己实例化对象时,不会发生这种情况.它是一个普通的PHP对象实例化.