yii2依赖注入
所谓依赖注入,实质上就是当某个类对象需要使用另一个类实例的时候,不在类内部实例化另一个类,而将实例化的过程放在类外面实现,实例化完成后再赋值给类对象的某个属性。 这样的话该类不需要知道赋值给它的属性的对象具体属于哪个类的,当需要改变这个属性的类型的时候,无需对这个类的代码进行任何改动,只需要在使用该类的地方修改实例化的代码即可。
依赖注入的方式有两种:1.构造函数注入,将另一个类的对象作为参数传递给当前类的构造函数,在构造函数中给当前类属性赋值;2.属性注入,可以将该类某个属性设置为public属性,也可以编写这个属性的setter方法, 这样就可以在类外面给这个属性赋值了。
依赖注入和依赖注入容器使用
<?php
namespace app\controllers;
use yii\di\Container;
class TestController extends \yii\base\Controller
{
public function actionIndex()
{
$container = new Container();
$container->set('app\controllers\Mail','app\controllers\MailOne');
$user = $container->get('app\controllers\User',['name'=>'huyongjian']);
$user->sentMail();
//依赖注入容器
//$container = new Container();
//$container->set('app\controllers\Mail','app\controllers\MailTwo');
//$user = $container->get('app\controllers\User',['name'=>'huyongjian']);
//服务器定位器
//$locator = new ServiceLocator;
//$locator->set('user', $user);
//$locator->user->sentMail();
//使用yii::$container和Yii::createObject
Yii::$container->set('app\controllers\Mail','app\controllers\MailTwo');
$user = Yii::createObject('app\controllers\User',['name'=>'huyongjian']);
$user->sentMail();
}
}
class User
{
public $mail;
public $name;
public function __construct(Mail $mail,$name)
{
$this->mail = $mail;
$this->name = $name;
}
public function sentMail(){
echo 'welcome ' . $this->name;
echo '<br>';
$this->mail->sentMail();
}
}
interface Mail{
public function sentMail();
}
class MailOne implements Mail{
public function sentMail(){
echo 'mail class sent One';
}
}
class MailTwo implements Mail{
public function sentMail(){
echo 'mail class sent two';
}
}
标签:依赖,name,app,controllers,user,sentMail,yii2,public,注入
From: https://www.cnblogs.com/hu308830232/p/18105457