Pimple相關的原始碼

2021-09-13 02:45:56 字數 2147 閱讀 5522

已經有了非常好的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...