文章詳情頁
40個跡象表明你還是PHP菜鳥
瀏覽:3日期:2024-02-17 11:05:11
這些跡象不只是用來告訴我是菜鳥,還告訴我還有很多要學習的。簡介40個跡象的英文版權歸Reinhold Weber所有,中譯文作者yangyang(aka davidkoree)。雙語版可用于非商業傳播,但須注明英文版作者、版權信息,以及中譯文作者。翻譯水平有限,請廣大PHPer指正。40個Conquer的作者是《PHPer》李俊鵬,可用于非商業傳播。正文我愿意把本文歸入我的“編程糗事”系列。盡管在正規大學課程中,接觸到軟件工程、企業級軟件架構和數據庫設計,但我還是時不時地體會到下述事實帶給我的“罪惡”感,當然,都是我的主觀感受,并且面向Eclipse。你是PHP菜鳥,如果你:1. 不會利用如phpDoc這樣的工具來恰當地注釋你的代碼Conquer 1phpDoc是PEAR下的一個優秀模塊,如同javadoc一樣為代碼生成API文檔。phpDoc采用OOP的思想編寫,它掃描指定目錄下的PHP源碼,識別出注釋中的專用標記然后生成XML文件(或其它),然后建立相應的索引。即本質是從源碼中的注釋生成文檔。2. 對優秀的集成開發環境如Zend Studio或Eclipse PDT視而不見Conquer 2我不知道該怎么描述Zend,只是夜色里有人曾這么說過:PHP界的Zend如同軟件界的微軟;而Eclipse則是另一款多功能的開發環境,想來大多數人都是用它來寫Java的(比如我),而PDT即PHP Development Tools則是可以使用戶可以在Eclipse寫PHP的插件。BTW,如果有興趣,你也可以自己為Eclipse開發個插件。^_^3. 從未用過任何形式的版本控制系統,如SubclipseConquer 3版本控制系統?還是先了解一下版本控制吧:版本控制就是數據倉庫,它可以記錄你對文件的每次更改。這樣自然也就了解了什么是版本控制系統了。而進一步的了解不是三兩句可以結束的,所以直接推薦,自己選擇一個吧!(1)http://www.phpchina.com/bbs/thread-46209-1-1.html(2)http://bbs.phpchina.com/thread-47473-1-1.html(3)http://bbs.phpchina.com/thread-89264-1-1.html4. 不采用某種編碼與命名標準,以及通用約定,不能在項目開發周期里貫徹落實Conquer 4我覺得良好的代碼書寫習慣令人很舒服,縮進實在是必需的——要不看著那一堆密密麻麻毫無美感的代碼,實在令人郁悶。縮進一般是4個空格,PEAR標準中不建議使用TAB鍵(在這里我小小汗顏一下),因為有些場合會出現問題(雖然我還沒遇到)。而命名建議變量:第一個單詞小寫開頭,其它大寫開頭如:myName,而類名建議都大寫開頭如:MyName或者My_Name,至于用不用下劃線我覺得差別不大(如果很大請指教)。5. 不使用統一開發方式Conquer 5由于還是個人PHP愛好者,所以對于團隊共同開發還是經驗匱乏的,在此,對于開發方式這個詞有種好像理解又不理解的錯覺,而且利用搜索引擎好久也很難找到一篇比較滿意的文章,所以直接推薦:(1)http://www.phpchina.com/html/42/1142-7314.html(2)http://topic.csdn.net/u/20080509/09/9b81d740-68fc-4d63-9299-ce6675f240cb.html(3)http://www.ibm.com/developerworks/cn/web/wa-jacquard/index.html#N10064其實,個人覺得開發方式這個詞挺泛、挺抽象……6. 不轉換(或)也不驗證某些輸入或SQL查詢串(譯注:參考PHP相關函數)Conquer 6始終堅信一點:絕不相信未經處理的用戶輸入。而過濾用戶輸入是Web安全的基礎。所以設計者始終應該清楚地知道數據的來源、過濾數據、將已經處理過的數據和未處理的數據區分開。7. 不在編碼之前徹底規劃你的程序Conquer 7我個人覺得這點和寫程序前畫流程圖之類或者做項目的開發流程一樣,應該不需要過多解釋。8. 不使用測試驅動開發Conquer 8測試驅動開發(Test Driven Development,英文縮寫TDD)是極限編程的一個重要組成部分,它的基本思想就是在開發功能代碼之前,先編寫測試代碼。也就是說在明確要開發某個功能后,首先思考如何對這個功能進行測試,并完成測試代碼的編寫,然后編寫相關的代碼滿足這些測試用例。然后循環進行添加其他功能,直到完成全部功能的開發。代碼整潔可用(clean code that works)是測試驅動開發所追求的目標。(摘自百度百科)9. 不在錯誤開啟狀態下進行編碼和測試(譯注:參考PHP函數error_reporting)Conquer 9我想一般寫代碼的時候都會開啟錯誤報告吧。這里順便了解下error_reporting原型為int error_reporting([ int $level]),該函數的作用是設置要顯示報告的錯誤等級,詳情參閱:http://cn2.php.net/manual/en/function.error-reporting.php10. 對調試器的好處視而不見Conquer 10推薦幾款調試器:(1)Zend IDE(2)APD(3)Xdebug11. 不重構你的代碼Conquer 11重構是指使用一系列重構準則(手法),在不改變“軟件之可察行為”前提下,調整其結構,是對軟件內部結構的一種調整。目的是在不改變“軟件之可察行為”前提下,提高其可理解性,降低其修改成本。重構的好處能改進軟件設計使軟件更容易被理解,幫助設計者找到BUG,并且提高軟件的開發速度。簡而言之,重構就是改進已經寫好的軟件的設計。12. 不使用類似MVC模式把程序的不同層次劃分開Conquer 12MVC(Model View Controller)即模型—視圖—控制器,視圖是呈現給用戶的一面,模型則是處理任務的模塊,而控制器則是控制視圖和模型間的映射,即在用戶響應下選擇何種模型進行處理,而任務處理后控制以何種視圖呈現。13. 不知道這些概念:KISS、DRY、MVC、OOP、RESTConquer 13(1)KISS是指Keep It Simple,Stupid(摘自wikipedia),指設計時要堅持簡約原則,避免不必要的復雜化。(2)DRY是指Don't Repeat Yourself(摘自wikipedia),特指在程序設計以及計算中避免重復代碼,因為這樣會降低靈活性、簡潔性,并且可能導致代碼之間的矛盾。(3)OOP即Object-Oriented Programming,是指面向對象的程序設計。我一直覺得經典的比喻是汽車是一個類(Class),而這個類的屬性有輪子、車身、馬達等,方法有加速、減速等;而勞斯萊斯就是一個對象(Object)了,這個對象繼承了汽車這個類的屬性和方法;而如何實現加速、減速?這樣的信息被隱藏了——即信息封裝(封裝),只留下用戶接口給我們了,比如踩剎車、踩油門;至于多態嘛,我粗糙比喻下就是一臺自動販賣機(我們假設它每種價格只有一款飲料),同樣是投幣這種方法,但是你投進去2元跟5元得到的結果是不一樣的——當然,除非這販賣機有問題。(4)REST(Representational State Transfer)是一種針對網絡應用的設計和開發方式,可以降低開發的復雜性,提高系統的可伸縮性。REST提出了一些設計概念和準則:a. 網絡上的所有事物都被抽象為資源(resource);b. 每個資源對應一個唯一的資源標識(resource identifier);c. 通過通用的連接器接口(generic connector interface)對資源進行操作;d. 對資源的各種操作不會改變資源標識;e. 所有的操作都是無狀態(stateless)。(摘自百度百科)14. 不用return而是直接在你的函數或類中輸出(echo/print)內容Conquer 14這一點,觀摩大蝦的源代碼都是用return的,所以我一般也這么學習使用這,至于原因,我就是覺得這樣用感覺蠻好的。或許是嚴禁風格吧。但是其實我對這句有點不理解,函數一般都是需要返回語句的嘛,除非是專門用來輸出的函數。15. 對單元測試或通用測試的優點視而不見Conquer 15(1)單元測試是在軟件開發過程中要進行的最低級別的測試活動,在單元測試活動中,軟件的獨立單元將在與程序的其他部分相隔離的情況下進行測試,不僅能保證項目進度還能優化設計。我記得我以前在寫比較長的C代碼的時候都會在特定模塊結束時補一段測試代碼來檢驗,不知道算不算。^_^(2)通用測試技術?這讓我想起圖書館里圖靈系列圖書的一本《軟件測試****》,具體名字忘記了。這些都是屬于軟件測試的范疇,如果需要可以下載:http://bbs.phpchina.com/thread-94241-1-1.html16. 總是返回硬編碼的HTML,卻不返回純粹的數據、字符串或對象17. 總是對“消息”和“配置參數”進行硬編碼Conquer 16-17硬編碼的使用會造成程序的不靈活,以后修改的復雜問題,還有可能會遇到編譯的問題。更具體了解:http://bbs.bc-cn.net/thread-32143-1-6.html18. 不對SQL查詢語句做優化Conquer 18SQL語句的優化是將性能低下的SQL語句轉換成目的相同的性能優異的SQL語句。這樣的好處是顯而易見的,可使用人工智能自動SQL優化。19. 不使用__autoload(譯注:參考PHP手冊相關描述)Conquer 19__autoload函數會在試圖使用尚未被定義的類時自動調用。通過調用此函數,腳本引擎在 PHP出錯失敗前有了最后一個機會加載所需的類。詳見:http://cn.php.net/__autoload20. 不允許智能錯誤處理(譯注:參考PEAR的ErrorStack)Conquer 20PEAR_ErrorStack提供了一種基于堆棧的錯誤處理方法,將各種錯誤統一起來指向同一個地方以達到把多個無關項目連接到同一個應用程序的目的。(譯自:http://pear.php.net/package/PEAR_ErrorStack)21. 使用$_GET替代$_POST來做具有破壞性的傳遞操作Conquer 21個人理解,使用$_GET會使一些信息暴露在URL中。22. 不知道怎么利用正則表達式Conquer 22正則表達式?我想可以去夜色找找shanji,或者到夜色共享手冊里下載一本學習:http://bbs.phpchina.com/thread-89223-1-1.html23. 從未聽說過SQL注入或跨站腳本Conquer 23(1)所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令,比如先前的很多影視網站泄露VIP會員密碼大多就是通過Web表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊;(2)業界對跨站攻擊的定義如下:“跨站攻擊是指入侵者在遠程Web頁面的HTML代碼中插入具有惡意目的的數據,用戶認為該頁面是可信賴的,但是當瀏覽器下載該頁面,嵌入其中的腳本將被解釋執行。”由于HTML語言允許使用腳本進行簡單交互,入侵者便通過技術手段在某個頁面里插入一個惡意HTML代碼,例如記錄論壇保存的用戶信息(Cookie),由于Cookie保存了完整的用戶名和密碼資料,用戶就會遭受安全損失。如這句簡單的Java腳本就能輕易獲取用戶信息:alert(document.cookie),它會彈出一個包含用戶信息的消息框。入侵者運用腳本就能把用戶信息發送到他們自己的記錄頁面中,稍做分析便獲取了用戶的敏感信息。(摘自百度百科)24. 不允許簡易配置,也不允許類的構造函數接受參數傳遞而后執行set/get方法,或運行時的常量定義Conquer 24就一句話:不要不允許類的構造函數接受參數傳遞。25. 不理解面向對象編程(OOP)的優勢和劣勢26. 不視情形大小而濫用OOP27. 自認為實現可復用的軟件一定等于/需要讓你的代碼遵循OOPConquer 25-27.OOP的優點:使人們的編程與實際的世界更加接近,所有的對象被賦予屬性和方法,結果編程就更加富有人性化。OOP的缺點:就C++而言,由于面向更高的邏輯抽象層,使得C++在實現的時候,不得不做出性能上面的犧牲,有時候甚至是致命的。28. 不利用智能缺省值Conquer 28我想,使用缺省值是個好習慣。29. 沒有單一的配置文件Conquer 29專門設置個config.php我想是需要的。30. 不想暴露文件源碼,卻用.inc后綴名取代了.phpConquer 30*.inc文件顧名思義是include file的意思,一般我們使用inc作為后綴,是因為這樣能體現該文件的作用。*.inc文件的作用有點類似于C/C++內的*.H、*.HPP頭文件,使用inc文件可以使我們的程序,增加可讀性,更易于開發和維護。31. 不使用數據庫抽象層Conquer 31請參考http://bbs.phpchina.com/thread-94258-1-1.html32. 不能保持DRY作風,即不重復自己,如果你總是在復制粘貼一些東西,說明你設計得很差勁Conquer 32請參考13點33. 沒有實現讓一個函數/類/方法只做一件事,也不能組合利用它們Conquer 33這需要鍛煉,在實踐中學習、完善著。34. 沒能嘗試OOP的特長,如抽象類、接口、多態、繼承,訪問控制修飾符(譯注:如public、private、protected)Conquer 34哦,my god,我想還是參考25-27吧,也是需要在實踐中成長的。35. 不用現有的設計模式優化你的程序體系設計Conquer 35推薦《Head First》設計模式36. 不允許你的用戶在你擁有很多文件或目錄的情況下定義基礎目錄Conquer 36保留,這點我有點懵。^_^37. 污染了名稱空間,比如用常見字符串命名你的庫函數Conquer 37哎,這實在是個不好的習慣,不過好習慣是養成的!38. 使用數據庫表時不使用表前綴Conquer 38我想,可能,PHPChina的數據表的前綴是PPC_或者PCC_。這的確是有好處的,我覺得,就好像字段名使用如txtUsername這樣的格式。39. 不使用統一的模板引擎Conquer 39這我都有點不知道該怎么說了,一個團隊一般都使用統一的模板引擎吧。40. 不關注已有的PHP開發框架,懶于探索;其實先進的開發理念和美妙代碼就蘊含其中。Conquer; 40比如Zend Framework、CakePHP、FleaPHP、ThinkPHP等。
標簽:
PHP
排行榜