已經有了非常好的pimple的相關解析,建議先看下:
pimple - 乙個簡單的 php 依賴注入容器
讀 php - pimple 原始碼筆記(上)
讀 php - pimple 原始碼筆記(下)
服務(類似單例):
$container['session'] = function ($c) ;
工廠服務(多個例項)
$container['session'] = $container->factory(function ($c) );
引數(僅僅是儲存一些變數)
$container['cookie_name'] = 'session_id';
保護引數(匿名函式都會被認為【1服務】,但是如果僅僅是想作為乙個引數,則需要用此方法)
$container['random_func'] = $container->protect(function () );
public function offsetset($id, $value)
//存入values
$this->values[$id] = $value;
//存入keys
$this->keys[$id] = true;
}
用【1服務】來舉例,呼叫offsetset方法後:
$this->values['session'] = function ($c) ;
$this->keys['session'] = true;
使用時$session=$container['session'];
,此時呼叫offsetget方法:
public function offsetget($id)
if (
isset($this->raw[$id])//$this->raw['session'],第一次呼叫是沒有的,所以為false,重複呼叫則為ture
|| !\is_object($this->values[$id])//所有的匿名函式都是object,所以為false。對應的情況【3引數】時為true
|| isset($this->protected[$this->values[$id]])//未呼叫protected方法,所以為false,對應的情況【4保護引數】時為true
|| !\method_exists($this->values[$id], '__invoke')//所有匿名函式存在__invoke方法,所以為false
) //判定是不是多個例項,對應【2工廠服務】,由於我們沒有呼叫factories方法,所以這一步也不會執行
if (isset($this->factories[$this->values[$id]]))
//此時$raw就是function ($c) 這個匿名函式
$raw = $this->values[$id];
//重新賦值$this->values['session'],將$this傳入,相當於function ($this),之所以把$this傳遞過來,是因為匿名函式中可能還包含其它的服務,
//例如上方的$c['session_storage'],$this傳入後相當於$container['session_storage'],此時會觸發呼叫offsetget此方法。
$val = $this->values[$id] = $raw($this);
//將原始的匿名函式存入$this->raw中,$this->raw['session']此時有值,重複訪問時在上方判定時直接返回,相當於單例模式
$this->raw[$id] = $raw;
//標記已凍結,已經get後則不允許offsetset或者extend了
$this->frozen[$id] = true;
//返回$this->values['session']
return $val;
}
pimple實現起來比較簡單,主要是通過匿名函式來實現,沒有像yii2容器那樣支援普通類的建構函式自動解析依賴注入關係等,但是對於僅僅是呼叫各個元件來說也足夠用了。 spark原始碼剖析 RDD相關原始碼閱讀筆記
最好的原始碼閱讀方法就是除錯,沒有之一 之前其實有閱讀過rdd相關的原始碼,最近學習過程中發現在之前原本閱讀過的模組中有一些 關節 並沒有打通,所以想通過除錯的方式來更細緻得學習原始碼。本文為編寫測試用例並除錯rdd相關模組的筆記,並沒有列出具體的除錯過程,僅列出結論以做備忘,特別是那些比較容易忽略...
Thread 類的原始碼相關
注意 run 方法存在於thread類 和 runnable 介面中 理解以下三種情況 定義乙個類繼承 thread 類,並重新了覆寫 run 方法,原先的 run方法就被子類的 run 方法覆蓋掉了,thread 類run 方法中的 target.run 就不可能執行了,執行緒物件 start 是...
HashMap的相關原始碼分析
前提知識 常見資料結構 暫未發布 j a.lang.object的hashcode與equals函式 hashmap的資料結構 基於hash表實現 原始碼分析 補充 暫未發布 transient瞬態非序列化關鍵字詳情 public class hashmap public final boolean...