php編碼習慣總結

PHP的編碼規範
https://github.com/PizzaLiu/PHP-FIG

1. php變量、函數、類、文件名命名要有意義

  1. 不用語言關鍵字
  2. 命名要有實際含義
  3. 命名風格保持一致
  4. 不用拼音命名

2.適當的使用註釋

終極要求:代碼就是註釋

  1. 好的代碼應該是自描述的
  2. 難以理解的地方加上註釋
  3. 函數的功能加上註釋說明
  4. 類的功能和使用方法加註釋

3.多備份重要的代碼

  1. 代碼不能只有一份
  2. 啓用編輯器的自動備份
  3. 用代碼管理工具備份

4.堅持字符編碼統一

PHP文件編碼 == 模版編碼 == 數據庫編碼

5.使用之前,變量要初始化

使用一個未定義的變量, 比使用一個定義好的變量要慢8倍以上!

可以相像 , PHP引擎會首先按照正常的邏輯來獲取這個變量 , 然而這個變量不存在 , 所以 PHP引擎需要拋出一個 NOTICE, 並且進入一段使用未定義變量時應該走的邏輯 , 然後返回 一個新的變量.
另外 , 閱讀代碼的角度講 , 當你使用一個未定義的變量時 , 會讓閱讀你代碼的人困惑 :”這 個變量在那裏初始化的 , 和之前的代碼有關係麼 ? 和 include進來的文件有關係麼

function getInfo($arrId){
    $ids = implode(',', $arrId);
    $query = mysql_query("select * from test where id in ($ids)");
    while($info = mysql_fetch_array($query)){
	    $info['name'] = trim($info['name']);
	    $info['addr'] = trim($info['addr']);
	    $list[] = $info;
    }
    return $list;
}

function getInfo($arrId){
    $list = array();
    $ids = implode(',', $arrId);
    $query = mysql_query("select * from test where id in ($ids)");
    while($info = mysql_fetch_array($query)){
	    $info['name'] = trim($info['name']);
	    $info['addr'] = trim($info['addr']);
	    $list[] = $info;
    }
    return $list;
}

6.使用 NULL === 來代替 is_null

is_null和 NULL === 完全是一樣的效果, 但是卻節省了一次函數調用.

7.儘量使用 === 儘量不用 ==

PHP有倆組相等比較運算符 === / !== 和 == / != , == / != 會有隱式類型轉換, 而 === / !==
會嚴格比較倆個操作時是否類型相同並且值相等.

8.避免在 for循環中計算

for($i=0; $i<strlen($str); $i++) {
}

會導致每次循環都調用strlen, 改爲

$j=strlen($str);
for ($i=0; $i<$j; $i++) {
}

9.strtr替代

$subject = 'hello, world';
echo strtr($subject, array('hello'=>'world', 'world'=>'hello'));
echo str_replace(['hello'=>'world'], ['world'=>'hello'],$subject);

strtr 是str_replace的4倍

10.優先使用單引號

$row[‘id’] 的效率是 $row[id] 的7倍

11.header頭的編碼

header("Content-type: text/html;charset=utf-8");

12.php結束標記不要寫

純 PHP 代碼,最好在文件末尾刪除 PHP 結束標記

13.測試環境開啓所有錯誤

error_reporting(7)
1:E_ERROR
2:E_WARNING
4:E_PARSE
但切記,上線之後要關閉我們的報錯,將我們的錯誤代碼寫入到錯誤日誌中,方便查錯

14.屏蔽錯誤非常低效

養成不用 @ 的好習慣

$handle = @file('a.txt');

15.用 FALSE表示錯誤 , 用 NULL表示不存在

對於操作類的函數, 失敗返回FALSE, 表示”操作失敗了”, 而對於查詢類的函數,
如果找不到想要的值, 則應該返回NULL, 表示”找不到”.

16.優先使用 PHP內置函數

正則耗時, 儘量避免, 而採用直接的字符串處理函數代替, 如:

filter_var('[email protected]', FILTER_VALIDATE_EMAIL);
有用的 PHP內置函數
usort — 使用用戶自定義的比較函數對數組中的值進行排序
rawurlencode — 按照 RFC 1738 對 URL 進行編碼
parse_url — 解析 URL,返回其組成部分
http_build_query — 生成 URL-encode 之後的請求字符串
exif_imagetype — 判斷一個圖像的類型
uniqid — 生成一個唯一ID
get_browser — 獲取瀏覽器具有的功能
str_word_count — 返回字符串中單詞的使用情況
我們 php手冊中常見的字符串函數和數組函數,也需要熟悉,優先使用

17.防禦式編程思想

不要相信外部的一切輸入! 所有的輸入都要檢查!
$username = htmlspecialchars($_GET['username']);

18.常見的 PHP的語法糖

echo(), print(),die(),isset(),unset(),include(),include_once(),requ
ire(),require_once(),array(),list(),empty(),eval()

19.echo的逗號和點號

逗號優於點號

$foo = 'hello';
$bar = 'world';
echo $foo . $bar;
echo $foo , $bar;

20.判斷字符串的長度

strlen()函數函數執行起來相當快,只返回在zval 結構中存儲的已知字符串長度。
但是由於strlen()是函數,多多少少會有些慢

$str = 'hello';
if (strlen($str) === 5) echo 'do sth...';
if (!isset($str[5])) echo 'do sth..';

21.使用 []代替

$arr = array();
$arr = [];
$arr = array(1,2,3,4);
$arr = [1,2,3,4];

22.用 … 定義變長參數函數

function addAll(...$num){
	$sum = array_sum($num);
	return $sum;
}
addAll(1,2,3,4,5,6,7);

23.不用eval()

eval() 能夠執行所有的php代碼,非常的危險!慎用!

eval('echo `pwd`;');

24.PHP代碼的優化

if代碼塊的優化
<?php
if ( 1 == $orderState ) {
	$status = 'success';
}else{
	$status = 'error';
}
return $status;
#### 完全可以簡化成如下代碼
$orderState = 'error';
if ( 1 == $orderState ) {
	$status = 'success';
}
return $status;
使用三元運算符來替換
<?php
	if ( !empty($_POST['action']) ) {
		$action = $_POST['action'];
	}else{
		$action = 'default';
	}
	#### 完全可以簡化成如下代碼
	$action = !empty($_POST['action']) ? $_POST['action'] : 'default';
中間結果賦值給變量
<?php
$str = 'this_is_test';
$res = implode('', array_map('ucfirst', explode('_', $str)));

#### 完全可以簡化成如下代碼

$str = 'this_is_test';
$words = explode('_', $str);
$uWords = array_map('ucfirst', $words);
$res = implode(' ', $uWords);
使用更加精悍短小的代碼
  • 函數的最佳最大長度是 50-150行代碼 ,更容易理解也方便修改
  • 函數參數 不超過7個
  • 只做一件事情的函數更易於複用
PHP的一些重點特性

php從5.3開始,5.4,5.5,5.6一直到7都在不停的更新,這個過程中,加入了一
些其他語言比較好的語法,剔除了一些爛的語法。如下:

  • default_charset從ISO-8859-1已經變爲UTF-8
  • 新增了動態訪問靜態方法的方式
  • 內置用於開發的 CLI 模式的 web server
  • 實例化時訪問類成員 (new Foo)->bar();
  • 新增 array_column() 函數
  • 直接通過下標獲取訪問數組和字符串字面量的元素或字符
  • empty() 支持傳入一個任意表達式,而不僅是一個變量
  • 新增 finally 關鍵字
  • 新增 trait 語法
  • 新增 yield 語法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章