最近準(zhǔn)備分析PHPCMS的整站代碼,下面這段話,寫的不錯,看了,受益匪淺,現(xiàn)在收藏下.
1. PHP語言沒有學(xué)好就不要去分析PHPCMS的代碼
我不太認(rèn)可這種觀點,因為掌握PHP語言是進行代碼分析的必要條件但不是充分條件,是不是PHP語言學(xué)好了我們就可以很好的分析代碼呢?回答是否定的,代碼分析不但需要掌握PHP語法,還需要有代碼分析和閱讀的技巧,如果沒有代碼分析和閱讀的技巧,光有PHP語法知識,分析工作一定很難做下去,至于代碼分析的技巧是什么,我會在下面談到,反過來,如果具有代碼分析的技巧,我們PHP語法也不需要學(xué)得很精通,當(dāng)然學(xué)得好總是有好處的,沒有副作用的.Vevb.com
這個結(jié)論的得出其實不難理解。PHP是計算機的語言,漢語和英語是人的語言,試想想,我們幾個人敢說我們的漢語很精通,中國的漢字至少有6萬多個,我們?nèi)粘S玫囊簿褪浅S玫?000個和次常用的3000個,我們有很多字都不認(rèn)識,有很多成語都不知道什么意思。但是我們閱讀和理解都不成問題,因為我們一直在用,我們看到不懂的字詞時,我們都會連猜帶蒙,這就是技巧,也適用于讀程序和讀英語文章.
再看看英語,國家培養(yǎng)的大學(xué)生通過了英語四級、六級考試,詞匯量都在五六千左右,可是英語還是說不出口,英文文章還是寫不出來,甚至看不懂,為什么呢?我們用的太少了。因此,計算機語言的學(xué)習(xí),掌握基本語法后,我們應(yīng)該更多的去寫程序,去讀程序,在用的過程中再學(xué)習(xí)和提高,否則,結(jié)果只能和英語一樣,寫不出程序也讀不懂程序,再說了,PHP語言學(xué)得好,就是所有的語法都掌握,所有的函數(shù)都掌握碼?那誰也做不到,做到了也沒有用,否則要字典、要參考手冊做什么?因此,只要學(xué)會了PHP的基本語法,就應(yīng)該立刻去分析代碼了,邊用邊學(xué),否則,永遠(yuǎn)只能紙上談兵。
2. 如何做代碼分析,也就是上面提到的代碼分析技巧
代碼分析一定要把握程序的主干和全局,我們第一眼看到PHPCMS的代碼時,都會頭大,因為這時我們看到了無數(shù)的葉子,我們要做的是從繁雜的葉子中理出枝條、主干和根本,只有掌握了枝條、主干和根本,才能把繁雜的葉子穿起來,否則,我們只能陷入細(xì)節(jié)的泥沼中難以自拔,甚至是一葉障目,只見樹木不見森林,對系統(tǒng)缺乏宏觀的把握.
技巧一:要有把握全局的眼光和意識
PHPCMS本質(zhì)上說是一個MIS系統(tǒng),所有網(wǎng)頁上的操作80%(我的估計不一定準(zhǔn)確)應(yīng)該是對數(shù)據(jù)庫中相應(yīng)表的添加、刪除和修改操作。因此,對于這80%的數(shù)據(jù)庫操作相關(guān)的功能模塊,我們可以用同樣的一個主線去分析。這個主線就是:頁面操作(包括:數(shù)據(jù)編輯和提交)->調(diào)用相應(yīng)的代碼文件->相應(yīng)的支撐函數(shù)->數(shù)據(jù)庫訪問。
技巧二:數(shù)據(jù)訪問功能的主線,所以我們一定要從功能使用上入手,而不是從代碼文件出發(fā),如果分析咨詢模塊,就用IE打開咨詢的頁面,從IE的地址欄觀察到調(diào)用的PHP文件名,然后我們再找到這個代碼文件去分析,這樣才有針對性,而且我們在讀代碼的時候可以和界面上的操作關(guān)聯(lián)起來,這樣非常有利于我們理解代碼.
分析代碼的時候只要用一個語句就可以搞定了。在代碼文件的頭部寫上ECHO語句,用來確認(rèn)我們要分析的代碼文件確實被調(diào)用,如果這個代碼文件沒有被調(diào)用,我們就不要分析,因為我們就想知道界面上的功能是如何用代碼實現(xiàn)的,我們就去找相應(yīng)的代碼文件。
IF和ELSE塊中寫上ECHO語句,用來判斷是IF分支被執(zhí)行還是ELSE分支被執(zhí)行,我們只分析被執(zhí)行的分支,不執(zhí)行的分支先略去。這就是找主干的技巧,我們要快速的從很多的代碼中找出哪些要看,哪些不要看(不執(zhí)行的就不去看),不能眉毛胡子一把抓,而是要快速的切入主題。當(dāng)然如果想要知道變量的值,還要用ECHO打印出來。直到最后找到數(shù)據(jù)庫操作的SQL語句。
技巧三:在代碼文件的任何位置用ECHO語句打印調(diào)試信息,這個主線就分析完了,我們把函數(shù)或者代碼文件的調(diào)用關(guān)系記錄下來就是詳細(xì)設(shè)計文檔,然后再花時間去分析細(xì)枝末節(jié)的東西.
3. PHPCMS代碼分析就是給代碼加注釋
經(jīng)過上面的分析,我們有些人可能已經(jīng)掌握了代碼分析技巧,有些人可能沒有,然后大家上來可能就開始給代碼加注釋了,認(rèn)為這就是代碼分析。這樣做我也不是很認(rèn)可,我認(rèn)為首先要做的是畫出函數(shù)或者代碼文件之間的調(diào)用關(guān)系圖。有了關(guān)系圖之后,再給代碼加注釋。我們現(xiàn)在做的工作是反向工程,對我們最有價值的是概要設(shè)計文檔和詳細(xì)設(shè)計文檔。概要設(shè)計文檔(如圖)

比如:咨詢功能有index.php調(diào)用post.php, list.php, show.php以及reply.php。詳細(xì)設(shè)計文檔(如圖)

比如:post.php對其他函數(shù)或代碼文件如何調(diào)用,最后需要的概要設(shè)計文檔和詳細(xì)設(shè)計文檔的具體內(nèi)容和格式可能比這個要更規(guī)范和詳細(xì),我這里只是為了說明問題,希望能起到拋磚引玉的作用.
這樣做的好處是我們看了post的詳細(xì)設(shè)計文檔就一目了然,知道調(diào)用了哪些全局函數(shù)(藍色),知道調(diào)用了哪些類的方法(紅色)。
以后如果我們寫類似的功能或者修改完善某個功能時,就可以參考這幅圖來做了,至于代碼中的注釋倒是其次的事情了,如果我們把每一行代碼都注釋上,本身沒有必要,而且也不科學(xué),因為PHPCMS代碼本身的變量名、函數(shù)名都是有意義的英文單詞,代碼本身就是很好的注釋,如果加上很多注釋其實多此一舉,反而增加了今后閱讀代碼人的閱讀工作量,另外也不利于代碼的維護,改了代碼之后還要改注釋.
當(dāng)然對于某些關(guān)鍵算法或者比較復(fù)雜的算法另當(dāng)別論。
技巧四:代碼分析先繪制設(shè)計文檔,再添加注釋,還是先把握主干,再深入細(xì)節(jié).
代碼文件名的命名
php文件命名有規(guī)律可循,有的php文件里面定義了多個函數(shù),這樣的文件名稱可能是*.func.php,一般放著全局函數(shù)或者公共函數(shù),有的里面定義了類,這樣的文件名稱可能是*.class.php,有的一個文件里面即沒有函數(shù)的定義,也沒有類的定義,這樣的文件就是就相當(dāng)一個函數(shù),完成特定的功能,一般文件名就是功能的描述,這樣的文件名稱可能是*.php,比如:post.php, list.php,index.php,等等,有的可能是包含(include,簡寫為inc)文件,里面定義了若干變量或聲明其他包含關(guān)系,這樣的文件名稱可能是*.inc.php.
新聞熱點
疑難解答
圖片精選