php開發編碼規范_第1頁
php開發編碼規范_第2頁
php開發編碼規范_第3頁
php開發編碼規范_第4頁
php開發編碼規范_第5頁
已閱讀5頁,還剩10頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、目錄1 編寫目的2 整體要求3 安全規范3.1 包含文件3.1.1 命名規則3.1.2 存放規則3.2 安全規則3.3 一些針對PHP的規則3.4 其它處理規則3.4.1 對輸入參數值進行轉義處理3.4.2 操作大HTML文本4 編碼規范4.1 命名規范4.1.1 變量命名4.1.2 類4.1.3 方法或函數4.1.4 縮寫詞4.1.5 數據庫表名4.1.6 數據庫字段4.2 書寫規則4.2.1 代碼縮進4.2.2 大括號 書寫規則4.2.3 小括號( )和函數、關鍵詞等4.2.4 符號書寫4.2.5 if else swith for while等書寫4.2.6 類的構造函數4.2.7 語句

2、斷行, 每行控制在80個字符以內4.2.8 不要不可思議的數字4.2.9 true/false和0/1判斷4.2.10 避免嵌入式賦值4.2.11 錯誤返回檢測規則4.3 程序注釋4.3.1 程序頭注釋塊4.3.2 類的注釋4.3.3 函數和方法的注釋4.3.4 變量或者語句注釋4.4 其他規范(建議)4.4.1 php代碼標記4.4.2 程序文件名、目錄名4.4.3 PHP項目通常的文件目錄結構4.4.4 PHP和HTML代碼的分離問題4.4.5 PHP項目開發中的程序邏輯結構5 特定環境下PHP編碼特殊規范5.1 變量定義5.2 引用的使用5.3 變量的輸入輸出1 編寫目的為了更好的提高技

3、術部的工作效率,保證開發的有效性和合理性,并可最大程度的提高程序代碼的可讀性和可重復利用性,指定此規范。開發團隊根據自己的實際情況,可以對本規范進行補充或裁減。2 整體要求技術部php開發規范將參照PEAR的規范,基本采用PEAR指定的規范,在其基礎上增加、修改或刪除部分適合具體開發環境的規范。本規范只針對PHP開發過程中編碼的規范,對于PHP開發項目中文件、目錄、數據庫等方面的規范,將不重點涉及。本規范包含了PHP開發時程序編碼中命名規范、代碼縮進規則、控制結構、函數調用、函數定義、注釋、包含代碼、PHP標記、文件頭的注釋塊、CVS標記、URL樣例、常量命名等方面的規則。3 安全規范3.1

4、包含文件3.1.1 命名規則提取出來具有通用函數的包含文件,文件后綴以.inc來命名,表明這是一個包含文件。如果有多個.inc文件需要包含多頁面,請把所有.inc文件封裝在一個文件里面,具體到頁面只需要包換一個.inc文件就可以了如:xxx_session.incxxx_comm.incxxx_setting.incmysql_db.inc把以上文件以一下方式,封裝在xxx.basic.inc文件里面require_once(”xxx_session.inc”);require_once(”xxx_comm.inc”);require_once(”xxx_setting.inc”);requi

5、re_once(”mysql_db.inc”);注:是否需要封裝到一個文件,視情況而定,如果每個inc的功能是分散到不同的頁面使用的話,就不建議封裝。3.1.2 存放規則一般包含文件不需要直接暴露給用戶,所以應該放在 Web Server訪問不到的目錄,避免因為配置問題而泄露設置信息。3.2 安全規則請參考產品安全檢查表。輸入和輸出檢查是否做了HTML代碼的過濾可能出現的問題:如果有人輸入惡意的HTML代碼,會導致竊取cookie, 產生惡意登錄表單,和破壞網站檢查變量做數據庫操作之前是否做了escape可能出現的問題:如果一個要寫入查詢語句的字符串變量包含了某些特殊的字符,比如引號( ,”)

6、或者分號(;) 可能造成執行了預期之外的操作。建議采用的方法:使用mysql_escape_string() 或實現類似功能的函數。檢查輸入數值的合法性可能出現的問題:異常的數值會造成問題。如果對輸入的數值不做檢查會造成不合法的或者錯誤的數據存入UDB、存入其它的數據庫或者導致意料之外的程序操作發生。舉例:如果程序以用戶輸入的參數值做為文件名,進行文件操作,惡意輸入系統文件名會造成系統損毀。核實對cookie的使用以及對用戶數據的處理可能出現的問題:不正確的cookie使用可能造成用戶數據泄漏訪問控制對內部使用的產品或者供合作方使用的產品,要考慮增加訪問控制logs確保用戶的保密信息沒有記在l

7、og中(例如:用戶的密碼)確保對關鍵的用戶操作保存了完整的用戶訪問記錄https對敏感數據的傳輸要采用https3.3 一些針對PHP的規則設置 register_globals = off (Y!PHP 已經禁止了register_globals,如果你使用Y!PHP可以不考慮這項設置)設置 error_reporting = E_ALL (Y!PHP 的缺省設置),并且要修正所有的error和warning將實際的操作放在被引用的文件中。把引用文件放到不可以被直接瀏覽的目錄下3.4 其它處理規則3.4.1 對輸入參數值進行轉義處理頁面接到參數需要SQL操作,這時候需要做轉義,尤其需要注意”

8、;”。如:$a = ” Lets go ” ;$sql = “Insert into tmp(col) values($a)” ;這種情況出現錯誤的不確定性。3.4.2 操作大HTML文本很多時候需要存放一大段HTML文本供頁面使用,象用戶定制頁頭頁腳等。需要剔除腳本標記,避免執行惡意php代碼。轉換”<"">“號,保證代碼完整。4 編碼規范4.1 命名規范制定統一的命名規范對于項目開發來說非常重要,不但可以養成程序員一個良好的開發習慣,還能增加程序的可讀性、可移植性和可重用性,還能很好的提高項目開發的效率。4.1.1 變量命名變量命名分為普通變量、靜態變量、局

9、部變量、全局變量、Session變量等方面的命名規則。 普通變量普通變量命名遵循以下規則:a 所有字母都使用小寫;b 對于一個變量使用多個單詞的,使用_'作為每個詞的間隔。例如:$base_dir、$red_rose_price等 靜態變量靜態變量命名遵循以下規則:a 靜態變量使用小寫的s_開頭;b 靜態變量所有字母都使用小寫;c 多個單詞組成的變量名使用_'作為每個詞的間隔。例子:$s_base_dir、$s_red_rose_prise等。 局部變量局部變量命名遵循以下規則:a 所有字母使用小寫;b 變量使用_'開頭;c 多

10、個單詞組成的局部變量名使用_'作為每個詞間的間隔。例子:$_base_dir、$_red_rose_price等。 全局變量全局變量應該帶前綴g',知道一個變量的作用域是非常重要的。例如global $gLOG_LEVEL;global $gLOG_PATH; 全局常量全局變量命名遵循以下規則:a 所有字母使用大寫b 全局變量多個單詞間使用_'作為間隔。例子:$BASE_DIR、$RED_ROSE_PRICE等。 session變量session變量命名遵循以下規則:a 所有字母使用大寫;b session變量名使用S_開頭;c

11、 多個單詞間使用_'間隔。例子:$S_BASE_DIR、$S_RED_ROSE_PRICE等。4.1.2 類php中類命名遵循以下規則:a 以大寫字母開頭;b 多個單詞組成的變量名,單詞之間不用間隔,各個單詞首字母大寫。例子:class MyClass 或class DbOracle等。4.1.3 方法或函數方法或函數命名遵循以下規則:a 首字母小寫;b 多個單詞間不使用間隔,除第一個單詞外,其他單詞首字母大寫。例子:function myFunction ()或function myDbOracle ()等。4.1.4 縮寫詞當變量名或者其他命名中遇到縮寫詞時,參照具體的命名規則,而

12、不采用縮寫詞原來的全部大寫的方式。例子:function myPear(不是myPEAR) functio getHtmlSource(不是getHTMLSource)。4.1.5 數據庫表名數據庫表名命名遵循以下規范:a 表名均使用小寫字母;b 對于普通數據表,使用_t結尾;c 對于視圖,使用_v結尾;d 對于多個單詞組成的表名,使用_間隔;例子:user_info_t和book_store_v等4.1.6 數據庫字段數據庫字段命名遵循以下規范:a 全部使用小寫;b 多個單詞間使用_間隔。例子:user_name、rose_price等。4.2 書寫規則書寫規則是指在編寫php程序時,代碼書

13、寫的規則,包括縮進、結構控制等方面規范:4.2.1 代碼縮進在書寫代碼的時候,必須注意代碼的縮進規則,我們規定代碼縮進規則如下:a 使用4個空格作為縮進,而不使用tab縮進(對于ultraedit,可以進行預先設置)例子:for ( $i=0;$i<$count;$i+ )echo "test"4.2.2 大括號 書寫規則在程序中進行結構控制代碼編寫,如if、for、while、switch等結構,大括號傳統的有兩種書寫習慣,分別如下:a直接跟在控制語句之后,不換行,如for ($i=0;$i<$count;$i+) echo "test"b

14、在控制語句下一行,如for($i=0;$i<$count;$i+)echo "test"其中,a是PEAR建議的方式,但是從實際書寫中來講,這并不影響程序的規范和影響用phpdoc實現文檔,所以可以根據個人習慣來采用上面的兩種方式,但是要求在同一個程序中,只使用其中一種,以免造成閱讀的不方便。4.2.3 小括號( )和函數、關鍵詞等小括號、關鍵詞和函數遵循以下規則:a 不要把小括號和關鍵詞緊貼在一起,要用一個空格間隔;如if ( $a<$b );b 小括號和函數名間沒有空格;如$test = date("ymdhis");c 除非必要,不要在

15、Return返回語句中使用小括號。 如Return $a;4.2.4 符號書寫在程序中=符號的書寫遵循以下規則:a 在=符號的兩側,均需留出一個空格;如$a = $b 、if ($a = = $b)等;b 在一個申明塊,或者實現同樣功能的一個塊中,要求=號盡量上下對其,左邊可以為了保持對齊使用多個空格,而右邊要求空一個空格;如下例:$testa = $aaa;$testaa = $bbb;$testaaa = $ccc;4.2.5 if else swith for while等書寫對于控制結構的書寫遵循以下規則:a 在if條件判斷中,如果用到常量判斷條件,將常量放在等號或不等號的左邊,例如:

16、if ( 6 = $errorNum ),因為如果你在等式中漏了一個等號,語法檢查器會為你報錯,可以很快找到錯誤位置,這樣的寫法要多注意;b switch結構中必須要有default塊;c 在for和wiile的循環使用中,要警惕continue、break的使用,避免產生類似goto的問題;4.2.6 類的構造函數如果要在類里面編寫構造函數,必須遵循以下規則:a 不能在構造函數中有太多實際操作,頂多用來初始化一些值和變量;b 不能在構造函數中因為使用操作而返回false或者錯誤,因為在聲明和實例化一個對象的時候,是不能返回錯誤的;4.2.7 語句斷行, 每行控制在80個字符以內在代碼書寫中,

17、遵循以下原則:a 盡量保證程序語句一行就是一句,而不要讓一行語句太長產生折行;b 盡量不要使一行的代碼太長,一般控制在80個字符以內;c 如果一行代碼太長,請使用類似 .= 的方式斷行書寫;d 對于執行數據庫的sql語句操作,盡量不要在函數內寫sql語句,而先用變量定義sql語句,然后在執行操作的函數中調用定義的變量;例子:$sql = "SELECT username,password,address,age,postcode FROM test_t "$sql .= " WHERE username='aaa'"$res = mysq

18、l_query($sql);4.2.8 不要不可思議的數字一個在源代碼中使用了的赤裸裸的數字是不可思議的數字,因為包括作者,在三個月內,沒人它的含義。例如:if      (22 = $foo) start_thermo_nuclear_war(); else if (19 = $foo)refund_lotso_money(); elsecry_cause_im_lost(); 你應該用define()來給你想表示某樣東西的數值一個真正的名字,而不是采用

19、赤裸裸的數字,例如:define("PRESIDENT_WENT_CRAZY", "22");define("WE_GOOFED", "19");define("THEY_DIDNT_PAY", "16"); if ( PRESIDENT_WENT_CRAZY = $foo)  start_thermo_nuclear_war(); else if 

20、;(WE_GOOFED = $foo) refund_lotso_money(); else if (THEY_DIDNT_PAY = $foo)infinite_loop(); elsehappy_days_i_know_why_im_here(); 4.2.9 true/false和0/1判斷遵循以下規則:a 不能使用0/1代替true/false,在PHP中,這是不相等的;b 不要使用非零的表達式、變量或者方法直接進行true/false判斷,而必須使用嚴格的完整true/false判斷;

21、如:不使用if ($a) 或者if (checka() 而使用if (FALSE != $a)或者 if (FALSE != check()4.2.10 避免嵌入式賦值在程序中避免下面例子中的嵌入式賦值:不使用這樣的方式:while ($a != ($c = getchar()process the character4.2.11 錯誤返回檢測規則檢查所有的系統調用的錯誤信息,除非你要忽略錯誤。為每條系統錯誤消息定義好系統錯誤文本,并記錄錯誤LOG。4.3 程序注釋每個程序均必須提供必要的注釋,書寫注釋要求規范,參照PEAR提供的注釋要求,為今后利用phpdoc生成php文檔做準備。程序注釋的

22、原則如下:a 注釋中除了文件頭的注釋塊外,其他地方都不使用/注釋,而使用/* */的注釋;b 注釋內容必須寫在被注釋對象的前面,不寫在一行或者后面;4.3.1 程序頭注釋塊每個程序頭部必須有統一的注釋塊,規則如下:a 必須包含本程序的描述;b 必須包含作者;c 必須包含書寫日期;d 必須包含版本信息;e 必須包含項目名稱;f 必須包含文件的名稱;g 重要的使用說明,如類的調用方法、注意事項等;參考例子如下:<?php/ +-+/ | PHP version 4.0                 

23、                       |/ +-+/ | Copyright (c) 1997-2001 The PHP Group                   |/ +-+/ | This source file is subject to  of the PHP license,     |/ | that is bu

24、ndled with this packafile LICENSE, and is     |/ | available at through the world-web at                   |/ |                    |/ | If you did not receive a copy of the  and ar

25、e unable to |/ | obtain it through the world-wide-web,end a note to      |/ | license so we can mail you a immediately.       |/ +-+/ | Authors: Stig Bakken <ssbfast.no>                      |/

26、|          Tomas V.V.Cox <cox>                |/ |                                                  

27、0;      |/ +-+/ $Id: Common.php,v 2001/11/13 01:26:48 ssb Exp $4.3.2 類的注釋類的注釋采用里面的參考例子方式:/* * Purpose: * 訪問數據庫的類,以ODBC作為通用訪問接口 * Package Name: Database * Author: Forrest Gump gump * Modifications: * No20020523-100: * odbc_

28、fetch_into()參數位置第二和第三個位置調換 * John Johnson John * See: (參照) */ class Database   4.3.3 函數和方法的注釋函數和方法的注釋寫在函數和方法的前面,采用類似下面例子的規則:/* * Purpose: * 執行一次查詢 * Method Name: Query()* * Param: string $queryStr SQL查詢字符串 * Param: strin

29、g $username 用戶名* * Author: Michael Lee* Return: mixed 查詢返回值(結果集對象) */ function($queryStr,$username)4.3.4 變量或者語句注釋程序中變量或者語句的注釋遵循以下原則:a 寫在變量或者語句的前面一行,而不寫在同行或者后面;b 注釋采用/* */的方式;c 每個函數前面要包含一個注釋塊。內容包括函數功能簡述,輸入/輸出參數,預期的返回值,出錯代碼定義。d 注釋完整規范。e 把已經注釋掉的代碼刪除,或者注明這些已經注釋掉的代碼仍然保留在源碼中的特殊原因。f例子:/*

30、0;* Purpose: * 數據庫連接用戶名 * Attribute/Variable Name: db_user_name * Type: string */ var db_user_name;4.4 其他規范(建議)4.4.1 php代碼標記所有的php程序代碼塊標記均使用4.4.2 程序文件名、目錄名程序文件名和目錄名命名均采用有意義的英文方式命名,不使用拼音或無意義的字母,同時均必須使用小寫字母,多個詞間使用_間隔。4.4.3 PHP項目通常的文件目錄結構建議在開發規范的獨立的PHP項目時,使用規范的文件目錄結構,這有助于提

31、高項目的邏輯結構合理性,對應擴展和合作,以及團隊開發均有好處。一個完整獨立的PHP項目通常的文件和目錄結構如下:/ 項目根目錄/manage 后臺管理文件存放目錄/css css文件存放目錄/doc 存放項目文檔/images 所有圖片文件存放路徑(在里面根據目錄結構設立子目錄)/scripts 客戶端js腳本存放目錄/tpl 網站所有html的模版文件存放目錄/error.php 錯誤處理文件(可以定義到apache的錯誤處理中)以上目錄結構是通常的目錄結構,根據具體應用的具體情況,可以考慮不用完全遵循,但是盡量做到規范化。4.4.4 PHP和HTML代碼的分離問題對性能要求不是很高的項目和應用,我們建議不采用PHP和HTML代碼直接混排的方式書寫代碼,而采用PHP和HTML代碼分離的方式,即采用模版的方式處理,這樣一方面對程序邏輯結構更加清晰有利,也有助于開發過程中人員的分工安排,同時還對日后項目的頁面升級該版提供更多便利。對于一些特殊情況,比如對性能要求很高的應用,可以不采用模版方式。4.4.5 PHP項目開發中的程序邏輯結構對于PHP項目開發,盡量采用OOP的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論