<code>interface Pay
{
public function run();
}
class Weixin implements Pay
{
public function run()
{
echo 'weixin';
}
}
class Ali implements Pay
{
public function run()
{
echo 'ali';
}
}
class PayServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton('weixin', function () {
return new Weixin;
});
$this->app->singleton('ali', function () {
return new Ali;
});
}
}
class A
{
// 这里注入应该填入什么参数? 怎么确定注入的是哪个类的实例
public functions __construct(Pay $pay)
{
}
}
</code><code>interface Pay
{
public function run();
}
class Weixin implements Pay
{
public function run()
{
echo 'weixin';
}
}
class Ali implements Pay
{
public function run()
{
echo 'ali';
}
}
class PayServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton('weixin', function () {
return new Weixin;
});
$this->app->singleton('ali', function () {
return new Ali;
});
}
}
class A
{
// 这里注入应该填入什么参数? 怎么确定注入的是哪个类的实例
public functions __construct(Pay $pay)
{
}
}
</code>
Service Container)的行为理解有误!第一,通过绑定服务id的方式定义的服务,只能通过服务id来获取,如下:
<code>// 定义服务
$this->app->singleton('service_id', function () {
return new Service();
})
// 获取服务,以下方式等价
$this->app->make('service_id');
$this->app['service_id'];</code>第二,你想通过接口的类型提示(Type Hint)来自动解析并注入服务,需要像下边这样:
<code>// 绑定接口到实例
$this->app->bind('Namespace\To\Your\Interface\Pay', 'Namespace\To\Your\Class\Weixin');</code>如果你需要注入服务的对象是通过服务容器(Service Container)来解析的,才可以使用类型提示(Type Hint)来进行自动解析并注入服务。以下这些类的实例都是通过服务容器来解析的:controllers, event listeners, queue jobs, middleware等,以及自己绑定到服务容器(Service Container)的服务。
第三,像上边这样,通过绑定接口到实例,只能自动解析为一个实例,也就是你绑定的实例;如果你想要的结果是,不同的类,构造器通过类型提示(Type Hint)相同的接口,注入不同的实例,可以像下边这样(上下文绑定,Context Binding):
<code>$this->app->when('Namespace\To\Your\Class\A')
->needs('Namespace\To\Your\Interface\Pay')
->give('Namespace\To\Your\Class\Weixin');
$this->app->when('Namespace\To\Your\Class\B')
->needs('Namespace\To\Your\Interface\Pay')
->give('Namespace\To\Your\Class\Ali');</code>通过上下文绑定,A的实例会注入Weixin的实例,而B的实例会注入Ali的实例。像下边:
<code>class A
{
public functions __construct(Pay $pay)
{
var_dump($pay instanceof Weixin); // True
}
}
class B
{
public functions __construct(Pay $pay)
{
var_dump($pay instanceof Ali); // True
}
}</code>
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号