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是