使用list來實現一次獲取explode後的特定段值:
list( , $mid) = explode(';', $string);c++
使用NULL === 來代替is_null:
is_null和 NULL === 徹底是同樣的效果, 可是卻節省了一次函數調用.程序員
使用===儘可能不用==:
PHP有倆組相等比較運算符===/!==和==/!=, ==/!=會有隱式類型轉換,而===/!==會嚴格比較倆個操做時是否類型相同而且值相等.
咱們應該儘可能使用===而不是==, 除了由於轉換規則比較難記之外, 還有一點就是若是使用===, 對於往後的維護或者閱讀你代碼的人也會很舒服:」在這個時刻, 這一行語句, 這個變量就是這個類型的!」.編程
少用/不用 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提供了第三個可選的參數, 經過這個參數能夠改變默認的比較方式.優化
if($a) {
} else if ($b) {
} else if ($c || $d) {
}
能夠簡單的改寫爲:debug
switch (TRUE) {
case $a:
break;
case $b:
break;
case $c:
case $d:
break;
}
是否是看起來更清晰呢?調試
能夠相像, PHP引擎會首先按照正常的邏輯來獲取這個變量, 然而這個變量不存在, 因此PHP引擎須要拋出一個NOTICE, 而且進入一段使用未定義變量時應該走的邏輯, 而後返回一個新的變量.
另外, 閱讀代碼的角度講, 當你使用一個未定義的變量時, 會讓閱讀你代碼的人困惑:」這個變量在那裏初始化的, 和以前的代碼有關係麼? 和include進來的文件有關係麼?」
最後, 從規範編程的角度來說, 你也須要這樣作.
不用第三變量交換倆個變量的值:
list($a, $b) = array($b, $a),
但其實仍是有匿名臨時變量的產生, 對於整數來講, 採用互逆的運算來作, 仍是比較靠譜:
$a = $a + $b;
$b = $a - $b;
$a = $a - $b;
不過, 仍是用異或比較好, 由於+ – * /容易產生精度丟失或者溢出.
floor == 倆次非運算(此條由skiyo提供)
echo ~~4.9;
echo floor(4.9);
用倆次非運算的速度基本上是floor的3倍, 不過有一點, 對於大數來講, 可能會發生溢出:
echo ~~99999999999999.99; //276447231
echo floor(99999999999999.99); //99999999999999
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 {
}
@func();
就至關於(參見深刻理解PHP原理之錯誤抑制與內嵌HTML):
$report = error_reporting(0);
func();
error_reporting($report);
另外錯誤抑制符號, 可能會形成一些問題, 參看(PHP錯誤抑制符(@)致使引用傳參失敗的Bug);
最後,錯誤抑制符在發生錯誤調試的時候也可能會帶來麻煩.
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']代替, 快不少.
for($i=0; $i<strlen($str); $i++) {
}
會致使每次循環都調用strlen, 改成
for ($i=0, $j=strlen($str); $i<$j; $i++) {
}
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) {}
echo "$name[2]";
PHP不知道程序員的意圖是$name . 「[2]「仍是$name[2],
因此建議, 都加上大括號:
echo "{$name}[2]";
//或者
echo "${name}[2]";
18..輸出多個字符串時,用逗號代替句點來分隔字符串,速度更快。
注意:只有echo能這麼作,它是一種能夠把多個字符串看成參數的「函數」
(譯註:PHP手冊中說echo是語言結構,不是真正的函數,故把函數加上了雙引號)。
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來作分析。