php之code tips

  1. 使用list來實現一次獲取explode後的特定段值:
    list( , $mid) = explode(';', $string);c++

  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提供了第三個可選的參數, 經過這個參數能夠改變默認的比較方式.優化

  1. switch不只僅只用來判別變量:
    好比, 對於以下的一段代碼:

if($a) {
} else if ($b) {
} else if ($c || $d) {
}
能夠簡單的改寫爲:debug

switch (TRUE) {
case $a:
break;
case $b:
break;
case $c:
case $d:
break;
}
是否是看起來更清晰呢?調試

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

能夠相像, PHP引擎會首先按照正常的邏輯來獲取這個變量, 然而這個變量不存在, 因此PHP引擎須要拋出一個NOTICE, 而且進入一段使用未定義變量時應該走的邏輯, 而後返回一個新的變量.

另外, 閱讀代碼的角度講, 當你使用一個未定義的變量時, 會讓閱讀你代碼的人困惑:」這個變量在那裏初始化的, 和以前的代碼有關係麼? 和include進來的文件有關係麼?」

最後, 從規範編程的角度來說, 你也須要這樣作.

  1. 不用第三變量交換倆個變量的值:
    list($a, $b) = array($b, $a),
    但其實仍是有匿名臨時變量的產生, 對於整數來講, 採用互逆的運算來作, 仍是比較靠譜:

    $a = $a + $b;
    $b = $a - $b;
    $a = $a - $b;
    不過, 仍是用異或比較好, 由於+ – * /容易產生精度丟失或者溢出.

  2. floor == 倆次非運算(此條由skiyo提供)
    echo ~~4.9;
    echo floor(4.9);
    用倆次非運算的速度基本上是floor的3倍, 不過有一點, 對於大數來講, 可能會發生溢出:

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

  3. 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 {
}

  1. 儘可能少用@錯誤抑制符
    以下代碼:

@func();
就至關於(參見深刻理解PHP原理之錯誤抑制與內嵌HTML):

$report = error_reporting(0);
func();
error_reporting($report);
另外錯誤抑制符號, 可能會形成一些問題, 參看(PHP錯誤抑制符(@)致使引用傳參失敗的Bug);

最後,錯誤抑制符在發生錯誤調試的時候也可能會帶來麻煩.

  1. 儘可能避免使用遞歸(此條來自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']代替, 快不少.

  1. 避免在for判斷條件中作運算(此條來自留言的Anonymous)
    以下的代碼:

for($i=0; $i<strlen($str); $i++) {
}
會致使每次循環都調用strlen, 改成

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

  1. 儘可能避免使用正則(此條來自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) {}

  1. 用大括號括起在雙引號和heredoc中的變量
    以下的代碼:

echo "$name[2]";
PHP不知道程序員的意圖是$name . 「[2]「仍是$name[2],

因此建議, 都加上大括號:

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

  1. 用FALSE表示錯誤, 用NULL表示不存在.
    對於操做類的函數, 失敗返回FALSE, 表示」操做失敗了」, 而對於查詢類的函數, 若是找不到想要的值, 則應該返回NULL, 表示」找不到」.

18..輸出多個字符串時,用逗號代替句點來分隔字符串,速度更快。
注意:只有echo能這麼作,它是一種能夠把多個字符串看成參數的「函數」
(譯註:PHP手冊中說echo是語言結構,不是真正的函數,故把函數加上了雙引號)。

  1. 當操做字符串並須要檢驗其長度是否知足某種要求時,
    你想固然地會使用strlen()函數。此函數執行起來至關快,
    由於它不作任何計算,只返回在zval 結構(C的內置數據結構,
    用於存儲PHP變量)中存儲的已知字符串長度。可是,因爲strlen()是函數,
    多多少少會有些慢,由於函數調用會通過諸多步驟,如字母小寫化
    (譯註:指函數名小寫化,PHP不區分函數名大小寫)、哈希查找,會跟隨被調用的函數一塊兒執行。
    在某些狀況下,你可使用isset() 技巧加速執行你的代碼。
    (舉例以下)
    if (strlen($foo) < 5) { echo 「Foo is too short」; }
    (與下面的技巧作比較)
    if (!isset($foo)) { echo 「Foo is too short」; }
    調用isset()恰巧比strlen()快,由於與後者不一樣的是,isset()做爲一種語言結構,
    意味着它的執行不須要函數查找和字母小寫化。也就是說,實際上在檢驗字符串長度的頂層代碼中你沒有花太多開銷。

20.當執行變量$i的遞增或遞減時,$i++會比++$i慢一些。 這種差別是PHP特有的,並不適用於其餘語言,因此請不要修改你的C或Java代碼並期望它們能當即變快, 沒用的。++$i更快是由於它只須要3條指令(opcodes),$i++則須要4條指令。 後置遞增實際上會產生一個臨時變量,這個臨時變量隨後被遞增。 而前置遞增直接在原值上遞增。這是最優化處理的一種,正如Zend的PHP優化器所做的那樣。 牢記這個優化處理不失爲一個好主意,由於並非全部的指令優化器都會作一樣的優化處理, 而且存在大量沒有裝配指令優化器的互聯網服務提供商(ISPs)和服務器。 21.儘可能採用大量的PHP內置函數。 22.若是在代碼中存在大量耗時的函數,你能夠考慮用C擴展的方式實現它們。 2三、評估檢驗(profile)你的代碼。檢驗器會告訴你,代碼的哪些部分消耗了多少時間。 Xdebug調試器包含了檢驗程序,評估檢驗整體上能夠顯示出代碼的瓶頸.一樣你也可使用目前很是cool的由facebook開發的xhprof來作分析。

相關文章
相關標籤/搜索