php開發軌範

來源:互聯網
上載者:User
php開發規範
檔案格式
對於只含有 php 代碼的檔案,我們將在檔案結尾處忽略掉 "?>"。
使用四個空格代替定位字元TAB,保證跨用戶端編程器軟體的靈活性【編輯器設定】。
每行代碼若超出了螢幕寬度,需要手動強制換行,增加可讀性。
每行結尾不允許有多餘的空格,刪除檔案末尾空格,但是末尾應該空一行【編輯器設定】。
請將編輯器設定對所有程式使用UNIX格式儲存。

命名規範
1. 常量定義全部為大寫,可使用_串連符

例如:
define('TEST', 'Hello World!');
const TEST = 'Hello World!';

2. 變數使用小寫字母+底線組成,其中private和protected變數要使用_首碼

例如:
public $per_page = 10;
protected $_user = null;
private $_db = null;

3. 函數名使用小寫字母+底線組成

例如:function get_client_ip();

4. 類名和方法名採用“駝峰法命名”,首字母小寫,其後每個單字首大寫,不允許使用底線,並且加上特定的修飾符,名字採用“動詞+賓語”的形式,不允許出現拼音,長度不宜超過5個單詞,盡量描述清楚方法的作用

例如:
public function getUserInfo();
get(動詞)UserInfo(賓語)

5. 參數名採用“駝峰法命名”,參數個數不宜超過5個,其他的請使用數組形式
6. 注釋採用PHPDoc形式,明確方法用途和參數含義

例如:
/**
* addData
* 添加資料
*
* @param integer $uid 使用者ID
* @param array $data 分享內容
* @return boolean
*/

代碼規範
1. 當一個字串是純文字組成的時候(即不含有變數),以單引號(')作為定界符。
2. 變數替換中的變數只允許用 {$+變數名} 的形式

例如:$greeting = "Hello {$name}, welcome back!";

3. 串連符“.”,“=”和其他運算子中間使用空格,增加可讀性

例如:
包括,在比較子(>、<、>=、<=、==、===、!=、<>、!==)、賦值運算子(=)、數學運算子(+、-、*、/、%)、位元運算符(&、|、^、~、>>、<<)、邏輯運算子(!、&&、||)、冒號(:)、
問號(?)、字串串連運算子(.)、字串串連賦值運算子(.=)前後,以及左括弧(()前(函數調用例外)、逗號(,)後請使用空格進行間隔。
echo 'My name is' . $name;
$name = 'bosnzt';
$num ++;

4. 方法和函數中的參數使用逗號+空格“, ”方式隔開,()與{中間要有空格,與方法名之間不能有空格,{和方法名保持在同一行,方法與方法之間也要空一行

例如:
public function addData($uid, $data = array()) {
// TODO
}

5. array 類型使用逗號+空格“, ”方式隔開,關聯陣列盡量分成多個行,並且保證每行的鍵與值的對齊,以保持美觀,“=>”兩邊要有空格

例如:
$data = array(1, 2, 3);
$data = array(
'name' => 'bosnzt',
'uid' => '100000',
);

6. 無論是if、for、foreach、while、do while 等等,都必須使用{},並且不能在同一行,}結束之後都要空一行,裡面的條件使用逗號+空格“, ”方式隔開,且保持縮排

例如:
if (!$uid) {
// TODO
}

for ($i; $i< 100; $i ++) {
// TODO
}

foreach ($data as $key => $val) {
// TODO
}

7. "switch" 語句的內容必須以四個空格縮排,"case" 條件控制的內容必須再加四個空格進行縮排

例如:
switch ($indentedSpaces) {
case 2:
echo "錯誤";
break;
case 4:
echo "正確";
break;
default:
break;
}

8. 單行注釋//和文字要用空格隔開,和代碼頭部對齊,並且和上行代碼空一行,多行注釋*和文字用空格隔開

例如:
/*
* 1、多行注釋盡量用來描述邏輯,防止以後忘記了一些重要邏輯
* 2、或者在開發過程中有些邏輯很複雜,在自己很難理清楚的情況之下,先將邏輯寫在多行注釋裡,有助於在開發的時候不會亂
*/
$name = $web_id ? '網頁' : '個人';

// 重新賦值,與上行代碼保持空行
if (!$uid) {
$name = 'Tom';
}

9. SQL關鍵詞語大寫,其他使用小寫

SELECT field1 AS something, field2, field3
FROM table a, table b
WHERE (this=that) AND (this2=that2)

10. if/foreach/for嵌套盡量不要超過4層,超過4層嵌套,可讀性非常的差,絕大多數情況都是可以最佳化的
11. 方法中的程式碼數控制在80行之內,多出的請盡量拆分成多個子方法

PHP 5.3
新特性
1.添加了命名空間的支援.
2.添加了靜態晚綁定支援.
3.添加了跳標籤支援.

goto a;
echo 'Foo';

a:
echo 'Bar';
?>

4.添加了原生的閉包(Lambda/匿名函數)支援.

array_map(function closure($arg) use ($var,....) {}, $array);

5.新增了兩個魔術方法, __callStatic(動態訪問靜態方法變為可能.) 和 __invoke(對象可以被執行).

class MethodTest {

public function __call($name, $arguments) {

// Note: value of $name is case sensitive.
echo "Calling object method '$name' "
. implode(', ', $arguments) . "\n";
}

/** As of PHP 5.3.0 */
public static function __callStatic($name, $arguments) {

// Note: value of $name is case sensitive.
echo "Calling static method '$name' "
. implode(', ', $arguments) . "\n";
}
}

$obj = new MethodTest;
$obj->runTest('in object context');

MethodTest::runTest('in static context'); // As of PHP 5.3.0
?>

6.添加了 Nowdoc 文法支援, 類似於 Heredoc 文法, 但是包含單引號.
7.使用 Heredoc 來初始化靜態變數和類屬性/常量變為可能.
8.可使用雙引號聲明 Heredoc, 補充了 Nowdoc 文法.
9.可在類外部使用 const 關鍵詞聲明 常量.
10.三元運算操作符有了簡寫形式: ?:.

$value = $planA ?: $planB;

11.異常可以被內嵌.
12.新增了循環參考的記憶體回收行程並且預設是開啟的.

void gc_enable ( void )
設定 zend.enable_gc 為 1, 啟用循環參考收集器。

不向下相容之處
儘管大多數現有的 PHP 5 代碼無需改變就可以工作,但是請注意一些不向下相容的變化:

在 PHP 5.3.x 的所有綁定擴充中應用了新的內部參數解析API, 當給函數傳遞了不相容的參數時將返回 NULL. 但有一些例外,比如函數 get_class() 在出現錯誤時將會返回 FALSE.

clearstatcache() 預設不再清除緩衝的 realpath.

realpath() 現在是完全與平台無關的. 結果是非法的相對路徑比如 __FILE__ . "/../x" 將不會工作.

call_user_func() 系列函數即使被調用者是一個父類也使用 $this.

數組函數 natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique() 將不再接受對象作為參數. 在將這些函數應用於對象時, 請首先將對象轉換為數組.

按引用傳遞參數的函數在被按值傳遞調用時行為發生改變. 此前函數將接受按值傳遞的參數, 現在將拋出致命錯誤. 之前任何期待傳遞引用但是在調用時傳遞了常量或者字面值 的函數, 需要在調用前改為將該值賦給一個變數。

新的 mysqlnd 庫需要使用 MySQL 4.1 新的 41 位元組密碼格式。繼續使用舊的 16 位元組密碼將導致 mysql_connect() 和其它類似函數 拋出 "mysqlnd cannot connect to MySQL 4.1+ using old authentication." 錯誤.

新的 mysqlnd 庫將不再讀取 MySQL 設定檔(my.cnf/my.ini), 這與舊版本的 libmysql 庫不同. 如果你的代碼依賴於這些配置 檔案, 你可以使用 mysqli_options() 顯式地載入它. 注意, 這意味著如果 PDO 中的 MySQL 支援使用了 mysqlnd 進行編譯,PDO 特有常量 PDO::MYSQL_ATTR_READ_DEFAULT_FILE 和 PDO::MYSQL_ATTR_READ_DEFAULT_GROUP 將是未定義的.

SplFileInfo 及其相關目錄類會移除末尾的 /.

__toString 魔術方法不再接受參數.

魔術方法 __get, __set, __isset, __unset, and __call 應該總是公用的(public)且不能是靜態(static). 方法簽名是必須的.

現在 __call 魔術方法在訪問私人的(private)和被保護的(protected)方法時被調用.

函數內 include 或者 require 一個檔案時,檔案內 將不能使用 func_get_arg(), func_get_args() 和 func_num_args() 函數。

新增了一個包裹在 MHASH 擴充外面的模擬層。但是並非所有的演算法都涉及到了,值得注意的是 s2k 雜湊演算法。這意味著 s2k 雜湊演算法在 PHP 5.3.0 中不再可用。

以下關鍵詞被保留,將不能被用作函數名, 類名等。

goto
namespace


PHPDOC
請查看PHPDOC

MySql技巧
1、索引

對簡單的SQL語句建立合適的索引有效調高效率,查詢條件多的情況建立複合索引。比如 index a_b_c(a,b,c)則有(a,b,c)、(a,b)、(a)三索引。
順序需要按照需求來設定。有集中方式會對索引產生影響
1、如果有條件範圍判斷,因為B-tree演算法導致 儲存引擎無法最佳化第一個條件範圍右邊的列,也就是後面的索引失效。
eg: SELECT * FROM t1 WHERE a=a1 AND b>b1 AND c=c1;那麼就是索引(a,b)生效而不是(a,b,c)這個時候如果改為index a_c_b (a,c,b)那麼效果就會優於前面。
2、避免過度索引。如果索引 id的取值 只有1,2,3三個值 那麼索引是沒什麼效果的。
3、含有null的索引會失效。
4、使用短索引(設定索引長度範圍)提高查詢速度減少磁碟I/O。
5、使用<>和NOT IN索引失效,全表掃描。
6、不要在列上運算。eg:select * from user where YEAR(data)>2012;導致索引失效,全表掃描。

2、多表聯集查詢最佳化

對多表聯集查詢請使用explain來進行分析。並用profile來查看效能情況。explain會對sql語句提出最佳化建議,profile可以看出各步操作的耗時。
explain使用過程重點查看 type,key,extra幾個欄位的值。
type從最好到最差的排序:system、const、eq_reg、ref、rang、index和ALL
extra幾個需要最佳化:Using filesort、Using temporary。(如果必須使用temporary請注意profile裡面如果有Copying to tmp table on disk,則需要加大tmp_table_size防止寫磁碟。)
key:如果為NULL則說明未使用到索引。這時候就要最佳化sql。
rows:根據id知道子句的執行順序,先大後小,大小一樣則先上後下。這樣應該rows小的先執行,並依此最佳化語句。

3、其他

沒有銀彈,只有取捨。
空間換時間永遠是最有效果也是最簡單的。不要過度追求資料庫範式,適當冗餘更有益健康。
裡大外小使用in,裡小外大使用exists.
對分頁總數,寫入memcache避免全表掃描。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.