最近準備分析PHPCMS的整站代碼,下面這段話,寫的不錯,看了,受益匪淺,現在收藏下.
1. PHP語言沒有學好就不要去分析PHPCMS的代碼
我不太認可這種觀點,因為掌握PHP語言是進行代碼分析的必要條件但不是充分條件,是不是PHP語言學好了我們就可以很好的分析代碼呢?回答是否定的,代碼分析不但需要掌握PHP語法,還需要有代碼分析和閱讀的技巧,如果沒有代碼分析和閱讀的技巧,光有PHP語法知識,分析工作一定很難做下去,至于代碼分析的技巧是什么,我會在下面談到,反過來,如果具有代碼分析的技巧,我們PHP語法也不需要學得很精通,當然學得好總是有好處的,沒有副作用的.Vevb.com
這個結論的得出其實不難理解。PHP是計算機的語言,漢語和英語是人的語言,試想想,我們幾個人敢說我們的漢語很精通,中國的漢字至少有6萬多個,我們日常用的也就是常用的3000個和次常用的3000個,我們有很多字都不認識,有很多成語都不知道什么意思。但是我們閱讀和理解都不成問題,因為我們一直在用,我們看到不懂的字詞時,我們都會連猜帶蒙,這就是技巧,也適用于讀程序和讀英語文章.
再看看英語,國家培養的大學生通過了英語四級、六級考試,詞匯量都在五六千左右,可是英語還是說不出口,英文文章還是寫不出來,甚至看不懂,為什么呢?我們用的太少了。因此,計算機語言的學習,掌握基本語法后,我們應該更多的去寫程序,去讀程序,在用的過程中再學習和提高,否則,結果只能和英語一樣,寫不出程序也讀不懂程序,再說了,PHP語言學得好,就是所有的語法都掌握,所有的函數都掌握碼?那誰也做不到,做到了也沒有用,否則要字典、要參考手冊做什么?因此,只要學會了PHP的基本語法,就應該立刻去分析代碼了,邊用邊學,否則,永遠只能紙上談兵。
2. 如何做代碼分析,也就是上面提到的代碼分析技巧
代碼分析一定要把握程序的主干和全局,我們第一眼看到PHPCMS的代碼時,都會頭大,因為這時我們看到了無數的葉子,我們要做的是從繁雜的葉子中理出枝條、主干和根本,只有掌握了枝條、主干和根本,才能把繁雜的葉子穿起來,否則,我們只能陷入細節的泥沼中難以自拔,甚至是一葉障目,只見樹木不見森林,對系統缺乏宏觀的把握.
技巧一:要有把握全局的眼光和意識
PHPCMS本質上說是一個MIS系統,所有網頁上的操作80%(我的估計不一定準確)應該是對數據庫中相應表的添加、刪除和修改操作。因此,對于這80%的數據庫操作相關的功能模塊,我們可以用同樣的一個主線去分析。這個主線就是:頁面操作(包括:數據編輯和提交)->調用相應的代碼文件->相應的支撐函數->數據庫訪問。
技巧二:數據訪問功能的主線,所以我們一定要從功能使用上入手,而不是從代碼文件出發,如果分析咨詢模塊,就用IE打開咨詢的頁面,從IE的地址欄觀察到調用的PHP文件名,然后我們再找到這個代碼文件去分析,這樣才有針對性,而且我們在讀代碼的時候可以和界面上的操作關聯起來,這樣非常有利于我們理解代碼.
分析代碼的時候只要用一個語句就可以搞定了。在代碼文件的頭部寫上ECHO語句,用來確認我們要分析的代碼文件確實被調用,如果這個代碼文件沒有被調用,我們就不要分析,因為我們就想知道界面上的功能是如何用代碼實現的,我們就去找相應的代碼文件。
IF和ELSE塊中寫上ECHO語句,用來判斷是IF分支被執行還是ELSE分支被執行,我們只分析被執行的分支,不執行的分支先略去。這就是找主干的技巧,我們要快速的從很多的代碼中找出哪些要看,哪些不要看(不執行的就不去看),不能眉毛胡子一把抓,而是要快速的切入主題。當然如果想要知道變量的值,還要用ECHO打印出來。直到最后找到數據庫操作的SQL語句。
技巧三:在代碼文件的任何位置用ECHO語句打印調試信息,這個主線就分析完了,我們把函數或者代碼文件的調用關系記錄下來就是詳細設計文檔,然后再花時間去分析細枝末節的東西.
3. PHPCMS代碼分析就是給代碼加注釋
經過上面的分析,我們有些人可能已經掌握了代碼分析技巧,有些人可能沒有,然后大家上來可能就開始給代碼加注釋了,認為這就是代碼分析。這樣做我也不是很認可,我認為首先要做的是畫出函數或者代碼文件之間的調用關系圖。有了關系圖之后,再給代碼加注釋。我們現在做的工作是反向工程,對我們最有價值的是概要設計文檔和詳細設計文檔。概要設計文檔(如圖)
比如:咨詢功能有index.php調用post.php, list.php, show.php以及reply.php。詳細設計文檔(如圖)
比如:post.php對其他函數或代碼文件如何調用,最后需要的概要設計文檔和詳細設計文檔的具體內容和格式可能比這個要更規范和詳細,我這里只是為了說明問題,希望能起到拋磚引玉的作用.
這樣做的好處是我們看了post的詳細設計文檔就一目了然,知道調用了哪些全局函數(藍色),知道調用了哪些類的方法(紅色)。
以后如果我們寫類似的功能或者修改完善某個功能時,就可以參考這幅圖來做了,至于代碼中的注釋倒是其次的事情了,如果我們把每一行代碼都注釋上,本身沒有必要,而且也不科學,因為PHPCMS代碼本身的變量名、函數名都是有意義的英文單詞,代碼本身就是很好的注釋,如果加上很多注釋其實多此一舉,反而增加了今后閱讀代碼人的閱讀工作量,另外也不利于代碼的維護,改了代碼之后還要改注釋.
當然對于某些關鍵算法或者比較復雜的算法另當別論。
技巧四:代碼分析先繪制設計文檔,再添加注釋,還是先把握主干,再深入細節.
代碼文件名的命名
php文件命名有規律可循,有的php文件里面定義了多個函數,這樣的文件名稱可能是*.func.php,一般放著全局函數或者公共函數,有的里面定義了類,這樣的文件名稱可能是*.class.php,有的一個文件里面即沒有函數的定義,也沒有類的定義,這樣的文件就是就相當一個函數,完成特定的功能,一般文件名就是功能的描述,這樣的文件名稱可能是*.php,比如:post.php, list.php,index.php,等等,有的可能是包含(include,簡寫為inc)文件,里面定義了若干變量或聲明其他包含關系,這樣的文件名稱可能是*.inc.php.
新聞熱點
疑難解答