Ci框架中Hooks可以理解:在框架的執行流程過程中,允許開發者在固定的某些時間點上(如:調用控制器前,調用控制器后等時間點上),調用其他函數來擴充CI框架執行流程的一種方法。技術上來就是通過配置文件,調用其他函數執行;
1、CI框架Hooks使用:
1.1、修改application/config/config.php文件,enable_hooks默認為FLASE,改成TRUE
1.2、配置鈎子調用相關信息,配置文件在application/config/hooks.php;需要在改文件定義個hook(不是hooks數組,別寫錯了)數組的hooks配置信息;一個加載點可以加載多個執行函數,改成如下:
其中,class為類名,function為調用函數名,filename為文件名,filepath為文件路徑,params為參數;
1.3、定義相應hooks調用的類文件,一般是存放在application/hooks/文件夾下面,寫法就像一般類一樣,主要類名和方法名要與hooks數組信息對應就像,如下:
通過上述配置,系統就會調用相應的hooks;
2、hooks原理;
在程序執行前,框架會加載Hooks,
其中load_class函數會嫌判斷Hooks類是否已經加載,如果沒加載則初始化該類,Hooks構造函數如下:
,主要是判斷config是否開啟hooks,如果開啟,則加載config/hoos.php配置文件、鈎子配置信息;然后框架通過調用hooks->call方法調用hoosk,如下:

call_hook函數如下:
,hook類通過call_hook解析配置,通過hook類中run_hook調用函數,run_hook函數如下:
Hooks運行原理完畢。
通過上面run_hooks代碼,可以知道配置hooks有如下四種方式:
$hook['pre_system'][] = function(){}
$hook['pre_system'][] = array($object,function1)
$hook['pre_system'][] = array('class','function','filename','filepath','params')
$hook['pre_system'][] = array('function','filename','filepath','params')
但是有點一個疑惑,$_in_progress變量的作用,為什么會出現死循環呢?