一次對CI框架update方法底層實現的探索之旅

2022-04-03 07:11:00 字數 1873 閱讀 9418

如果執行資料更新,ci框架一般都是如此呼叫$this->db->update,這是如何實現的呢

ci框架的db->update

print_r($this->db),知道了他的細節,他的名字,屬性,

然後在系統資料夾中找到了這個類檔案,

發現並沒有update這個方法

去他的父類中尋找

然而並沒有發現ci_db這個檔案

在db.php中發現了這樣的**:

i.          這個**,定義了ci_db,雖然類內什麼都沒有,但是它繼承了ci_db_active_record或者ci_db_driver,至於根據什麼判斷去繼承,日後研究

ii.          而db.php早已經在呼叫$this->db->update之前載入好了

iii.          在本專案中,是走上者的,即繼承了ci_db_active_record

7.去檢視ci_db_active_rec.php並找到了update方法

9.在update方法中,對需要update的資料$set進行處理

10.去看set方法,

b)      這是把每一項需要修改的資料通過escape方法處理後,放到ar_set屬性中

c)      去找escape方法,它在父類ci_db_driver中,

e)      看到此方法中是呼叫escape_str方法進行的處理

f)       然後總是想當然的認為此方法就在父類ci_db_driver裡

g)      可是父類ci_db_driver並沒有此方法,而且並沒有繼承任何類

h)      當時就找啊找,總以為用了類似於__call之類的方法,或者我沒有接觸過的方法

i)       後來,捋一捋繼承順序

i.          ci_db_mysql_driver extends ci_db(escape_str在ci_db_mysql中)

ii.          class ci_db extends ci_db_active_record

iii.          class ci_db_active_record extends ci_db_driver(ci_db_driver::escape方法裡呼叫了ci_db_mysql:: escape_str)

j)       終於明白了,這個escape方法,只能在建立ci_db_mysql_driver的例項的時候,才能呼叫內部的escape_str

舉個簡單的例子,下圖父類中的fathermethod方法,只有在子類child去呼叫時,才不會出錯,因為fathermethod方法呼叫了在子類內部才定義的方法

對一次ARP欺騙分析

一 實驗目的 二 實驗內容 通過科來資料報生成器在a主機上偽造乙個arp資料報,並傳送出去,將b主機的閘道器mac位址的快取修改為a的mac位址。三 實驗用到的工具 wireshark 科來資料報生成器 若是在win7 8上還需要科來資料報 器來發包 科來資料報生成器在win7 8上無法使用發包功能...

對udp dns的一次思考

目前昨天查乙個線上問題 dns伺服器在我們的裝置,有大量的終端到裝置上請求解析網域名稱,但是一直是單執行緒,dns報文處理不過來 然而裝置是多核,dns伺服器一直不能利用多核資源,所以能不能使用多執行緒進行處理呢?udp不像tcp那樣,udp沒有連線的概念,也就是沒有通過建立多個連線來提高對dns伺...

對一次ARP欺騙分析

一次arp欺騙 一 實驗目的 學習使用科來資料報生成器構造乙個資料報 通過一次arp實驗,分析arp報文格式 二 實驗內容 通過科來資料報生成器在a主機上偽造乙個arp資料報,並傳送出去,將b主機的閘道器mac位址的快取修改為a的mac位址。三 實驗用到的工具 四 實驗平台 本次實驗我是在虛擬機器裡...