php 简单理解依赖注入和自动加载

参考:https://blog.csdn.net/soonfly/article/details/52627683

参考:https://blog.csdn.net/sd19871122/article/details/78696114

       因为在学习tp5框架,经常看到一种写法__construct(Request $request){$this->request=$request}的写法,不知道这是什么意思,后来百度了一下,这个叫做依赖注入,具体的含义找了很多文章来看,有了一些比较浅的理解,这里记录一下。

       首先,什么是依赖,依赖就是A类引用了B类并在函数中实例化使用了,没有B类的话A类就会报错,执行不下去。所以A类与B类之间就存在依赖关系,并且是A依赖着B。

       知道了什么是依赖关系,那么继续说依赖注入。简单的来说,依赖注入就是不在A类中进行实例化B,而是在A类的外面就把B类实例化好,然后通过参数的方式传入A类,再在A类中赋值给A类里的自定义变量。举(fu)个(zhi)栗(zhan)子(tie):

由于大佬没有写全,所以我补点东西

class Storage{

      function   __construct($text=''){

           echo $text;

       }

}

  • 构造函数注入
class User
{
  function __construct($storage)
  {
    $this->storage = $storage;
  }

  // ...
}

new  $user=User(new Storage('text'));

  • setter方法注入
class User
{
  function setSessionStorage($storage)
  {
    $this->storage = $storage;
  }

  // ...
}

new  $user=User();

$user->setSessionStorage(new Storage('text'))

  • 属性直接注入
class User
{
  public $sessionStorage;
}

$user->sessionStorage = $storage;

$user->sessionStorage=new Storage('text'))

根据经验,一般通过构造函数注入的是强依赖关系的组件,setter方式用来注入可选的依赖组件。 

       各人感觉依赖注入的好处在于不用重复修改代码,比如你的B类过时了,需要换成C类,但是方法名不变的情况下,如果不用依赖注入,你得去A类里找到newB 类的地方,改成new C类。而依赖注入则只需要在用的时候把B类改成C类就行了,省掉了找的过程。

       好的,说完了依赖注入再说下自动加载。自动加载就很有用了,它会在你调用不存在的类时触发,机制是在报错前先触发。有两个方法可以触发自动加载__autoload和spl_autoload_register()。举个例子:

       

输出:

123aaa
Fatal error: Class 'aaa' not found in E:\phpstudy\PHPTutorial\WWW\index.php on line 11

        spl_autoload_register()是用来注册调用不存在的类时触发的函数的,触发的先后顺序是按照注册的先后顺序。                             spl_autoload_register()后面还有两个参数,spl_autoload_register('bbb',true,true);第一个true是当你spl_autoload_register()里写的函数无法成功注册时, spl_autoload_register()是否抛出异常。第二个true会把注册的函数排在运行的首位,触发的时候就不会按注册的先后顺序触发了。__autoload的作用和 spl_autoload_register()一样,但是__autoload只能注册一个函数。

        以上就是个人对依赖注入和自动加载的理解了。如果有误还请大家指点。

你可能感兴趣的:(php)