php編碼習慣總結
- 1. php變量、函數、類、文件名命名要有意義
- 2.適當的使用註釋
- 3.多備份重要的代碼
- 4.堅持字符編碼統一
- 5.使用之前,變量要初始化
- 6.使用 NULL === 來代替 is_null
- 7.儘量使用 === 儘量不用 ==
- 8.避免在 for循環中計算
- 9.strtr替代
- 10.優先使用單引號
- 11.header頭的編碼
- 12.php結束標記不要寫
- 13.測試環境開啓所有錯誤
- 14.屏蔽錯誤非常低效
- 15.用 FALSE表示錯誤 , 用 NULL表示不存在
- 16.優先使用 PHP內置函數
- 17.防禦式編程思想
- 18.常見的 PHP的語法糖
- 19.echo的逗號和點號
- 20.判斷字符串的長度
- 21.使用 []代替
- 22.用 ... 定義變長參數函數
- 23.不用eval()
- 24.PHP代碼的優化
PHP的編碼規範
https://github.com/PizzaLiu/PHP-FIG
1. php變量、函數、類、文件名命名要有意義
- 不用語言關鍵字
- 命名要有實際含義
- 命名風格保持一致
- 不用拼音命名
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 語法