static $funcs = array();... ...$key = md5($path);if (isset($funcs[$key])) return true;if (file_exists(PC_PATH.$path)) { include PC_PATH.$path;} else { $funcs[$key] = false; return false;}$funcs[$key] = true;return true;
上述代碼是對include_once的最佳化,在每次include $file的時候都將$file放入$funcs中,避免重複匯入。
那麼問題是:$key = md5($path);是什麼依據,感覺這麼做沒什麼意義。
回複內容:
static $funcs = array();... ...$key = md5($path);if (isset($funcs[$key])) return true;if (file_exists(PC_PATH.$path)) { include PC_PATH.$path;} else { $funcs[$key] = false; return false;}$funcs[$key] = true;return true;
上述代碼是對include_once的最佳化,在每次include $file的時候都將$file放入$funcs中,避免重複匯入。
那麼問題是:$key = md5($path);是什麼依據,感覺這麼做沒什麼意義。
首先我覺得這麼做是沒意義的,不會比直接用 include_once 更好。
然後這是一個比較常見的設計(雖然我覺得在這裡沒有什麼意義),在需要通過 key 來尋找 value 時,如果沒有擷取 key 的需要,那麼可以將 key 散列之後作為 key, 這樣可以:
- 避免因為 key 含有特殊的字元,或者為空白造成一些詭異的錯誤
- 避免因為 key 很長而佔用大量的記憶體
- 儲存上考慮,md5值整齊,長度一致,path可能會很長
- ~~效率上考慮,path很可能前面很長一段都是一樣的,比如
../../lib/service/database/...,而md5值比較離散,一般比較開頭1~2個字元就可以確定是否不同~~
謝樓下指正,第2點描述不正確。翻了下源碼,array內部確實對key已經有了hash操作,所以這裡多一次md5的hash沒有太大必要
md5一下再存沒必要。PHP的數組就是個黑洞級雜湊表,什麼都能往裡塞。 你無論輸入什麼,key都會首先被雜湊一發,所以不需要你提前處理。