yii2依赖注入

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';
    }
}
 
posted @ 2024-03-30 14:36  胡勇健  阅读(9)  评论(0编辑  收藏  举报