1. 程式人生 > >php 簡單理解依賴注入和自動載入

php 簡單理解依賴注入和自動載入

       因為在學習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()。舉個例子:

<?php
function aaa($class){
    echo $class;
}
function bbb(){
    echo 123;
}

spl_autoload_register('aaa');
spl_autoload_register('bbb',true,true);
$a=new aaa();

輸出:

123aaaFatal 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是