一些PHP Coding Tips(php小技巧)[2011/04/02最後更新]_php技巧

來源:互聯網
上載者:User
最後更新: 2011/04/02

1. 使用list來實現一次擷取explode後的特定段值:
list( , $mid) = explode(';', $string);
2. 使用NULL === 來代替is_null:
is_null和 NULL === 完全是一樣的效果, 但是卻節省了一次函數調用.

3. 使用===盡量不用==:
PHP有倆組相等比較子===/!==和==/!=, ==/!=會有隱式類型轉換,而===/!==會嚴格比較倆個操作時是否類型相同並且值相等.
我們應該盡量使用===而不是==, 除了因為轉換規則比較難記以外, 還有一點就是如果使用===, 對於日後的維護或者閱讀你代碼的人也會很舒服:”在這個時刻, 這一行語句, 這個變數就是這個類型的!”.

4. 少用/不用 continue:
continue是回到迴圈的頭部, 而迴圈結束本來就是回到迴圈的頭部, 所以通過適當的構造, 我們完全可以避免使用這條語句, 使得效率得到改善.

5. 警惕switch/in_array等的松比較(loose comparision):
switch和in_array都是採用松比較, 所以在要比較的變數之間類型不一樣的時候, 很容易出錯:

複製代碼 代碼如下:

switch ($name) {
case "laruence":
...
break;
case "eve":
...
break;
}

對於上面的switch, 如果$name是數字0, 那麼它會滿足任何一條case. 同理在in_array中也是.
解決的辦法就是, 在switch之前, 把變數類型轉換成你所期望的類型.
複製代碼 代碼如下:

switch (strval($name)) {
case "laruence":
...
break;
case "eve":
...
break;
}


而, in_array提供了第三個可選的參數, 通過這個參數可以改變預設的比較方式.
6. switch不僅僅只用來判別變數:
比如, 對於如下的一段代碼:
複製代碼 代碼如下:

if($a) {
} else if ($b) {
} else if ($c || $d) {
}

可以簡單的改寫為:
複製代碼 代碼如下:

switch (TRUE) {
case $a:
break;
case $b:
break;
case $c:
case $d:
break;
}

是不是看起來更清晰呢?
7. 變數先定義後使用:
使用一個未定義的變數, 比使用一個定義好的變數要慢8倍以上!
可以相像, PHP引擎會首先按照正常的邏輯來擷取這個變數, 然而這個變數不存在, 所以PHP引擎需要拋出一個NOTICE, 並且進入一段使用未定義變數時應該走的邏輯, 然後返回一個新的變數.
另外, 閱讀代碼的角度講, 當你使用一個未定義的變數時, 會讓閱讀你代碼的人困惑:”這個變數在那裡初始化的, 和之前的代碼有關係麼? 和include進來的檔案有關係麼?”
最後, 從規範編程的角度來講, 你也需要這樣做.
8. 不用第三變數交換倆個變數的值:
list($a, $b) = array($b, $a),
但其實還是有匿名臨時變數的產生, 對於整數來說, 採用互逆的運算來做, 還是比較靠譜:
複製代碼 代碼如下:

$a = $a + $b;
$b = $a - $b;
$a = $a - $b;

不過, 還是用異或比較好, 因為+ – * /容易產生精度丟失或者溢出.
9. floor == 倆次非運算(此條由skiyo提供)
複製代碼 代碼如下:

echo ~~4.9;
echo floor(4.9);

用倆次非運算的速度基本上是floor的3倍, 不過有一點, 對於大數來說, 可能會發生溢出:
複製代碼 代碼如下:

echo ~~99999999999999.99; //276447231
echo floor(99999999999999.99); //99999999999999

10. do{}while(0)妙用(此條由Qianfeng提供)
我們知道do{}while(0)在c/c++中, 有很多妙用, 比如消除goto, 宏定義代碼塊.
所以, PHP中同理, 也可以用do{}while(0)來做一些巧妙的應用
複製代碼 代碼如下:

do{
if(true) {
break;
}
if(true) {
break;
}
} while(false);
//好過
if(true) {
} else if(true) {
} else {
}

11. 盡量少用@錯誤抑制符
如下代碼:
複製代碼 代碼如下:

@func();

就相當於(參見深入理解PHP原理之錯誤抑制與內嵌HTML):
複製代碼 代碼如下:

$report = error_reporting(0);
func();
error_reporting($report);

另外錯誤抑制符號, 可能會造成一些問題, 參看(http://www.jb51.net/article/27022.htm);
最後,錯誤抑制符在發生錯誤調試的時候也可能會帶來麻煩.
12. 盡量避免使用遞迴(此條來自lazyboy)
遞迴效能堪憂, 而大部分的遞迴都是尾遞迴, 都是可以消除的.
複製代碼 代碼如下:

function f($n) {
if ($n = 0) return 1;
return $n * f($n - 1);
}
//變為:
$result = 1;
for ($y = 1; $y < $n + 1; $y++ ) {
$result *= $y;
}

13. 使用$_SERVER['REQUEST_TIME']代替time()
time()會引來一次函數調用, 而如果對時間的精確值要求不高, 可以使用$_SERVER['REQUEST_TIME']代替, 快很多.
14. 避免在for判斷條件中做運算(此條來自留言的Anonymous)
如下的代碼:
for($i=0; $i<strlen($str); $i++) {
}
會導致每次迴圈都調用strlen, 改為
for ($i=0, $j=strlen($str); $i<$j; $i++) {
}
15. 盡量避免使用正則(此條來自pangyontao)
正則耗時, 盡量避免, 而採用直接的字串處理函數代替, 如:
複製代碼 代碼如下:

if (preg_match("!^foo_!i", "FoO_")) { }
// 替換為:
if (!strncasecmp("foo_", "FoO_", 4)) { }
if (preg_match("![a8f9]!", "sometext")) { }
// 替換為:
if (strpbrk("a8f9", "sometext")) { }
if (preg_match("!string!i", "text")) {}
// 替換為:
if (stripos("text", "string") !== false) {}

等等.
16. 用大括弧括起在雙引號和heredoc中的變數
如下的代碼:
echo "$name[2]";
PHP不知道程式員的意圖是$name . “[2]“還是$name[2],
所以建議, 都加上大括弧:
複製代碼 代碼如下:

echo "{$name}[2]";
//或者
echo "${name}[2]";

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.