從PHP在1995年誕生就快速的成長。此後,php已經成為web應用中最流行的編程語言。許多流行的網站都是由php驅動,而且大多數的腳本和網絡程序都是由這個流行語言編寫的。
由於PHP的盛行,使網絡開發者幾乎不可能不懂一點的PHP知識。這個教程針對的是那些只是經歷了PHP的初級階段,並且准備卷起袖子,深入進去這個語言的人。下面列出的是PHP開發者應該學習並且在每次編程時使用的十條優秀的技術。這些經驗能夠加速開發者精通並且讓代碼更易感知的、整潔而且對代碼執行來說更優化。
1.使用一個SQL注入攻擊表A list of common SQL injections.
SQL注入攻擊是一個險惡的行為,SQL注入攻擊是一個可以讓黑客利用代碼的弱點進入你的數據庫的安全漏洞利用。雖然這篇文章不是Mysql相關的,但是很多PHP程序員都是用的Mysql數據庫,所以如果你想寫安全的代碼的話學習如何避免(SQL注入)是很容易的。
Furruh Mavituna有一個很好的SQL injection cheat sheet,裡面有一部分是關於PHP和Mysql編程的弱點的。如果你能避免這個cheat sheet指出的習慣,你的代碼會變得更少的易於腳本攻擊。
2. 學習比較操作符之間的不同PHP’s list of comparison operators.
比較操作符是PHP中巨大的一部分,而且很多程序員不能像他們應該的那樣在它們之間的區別方面那麼熟練。實際上,一篇在I/O reader的文章表明,很多PHP程序員不能正確的說出比較操作符之間的區別。Tsk tsk。
These are extremely useful and most PHPers can’t tell the difference between == and ===. Essentially, == looks for equality, and by that PHP will generally try to coerce data into similar formats, eg: 1 == ‘1′ (true), whereas === looks for identity: 1 === ‘1′ (false). The usefulness of these operators should be immediately recognized for common functions such as strpos(). Since zero in PHP is analogous to FALSE it means that without this operator there would be no way to tell from the result of strpos() if something is at the beginning of a string or if strpos() failed to find anything. Obviously this has many applications elsewhere where returning zero is not equivalent to FALSE.
要明白,==代表著同等,===代表著一致。你可以看一篇在PHP.net網站上的list of the comparison operators 這篇文章。
3 剪短else語句需要聲明的是第3條和第4條都有點讓代碼的可讀性降低,這兩條強調的是速度和執行。如果你選擇不犧牲可讀性,那麼你可以略過這兩條。
可以讓代碼更簡單更小的任何事情通常都是一個好習慣。這條的目的是將“中間人”從else語句中拿出來,so to speak。Christian Montoya有一個非常好的用短的else語句來減少字符的例子。
一般的else語句
[code language="php"]
if( this condition )
{
$x = 5;
}
else
{
$x = 10;
}
[/code]
如果$x默認的是10,將它初始化為10就 可以了。沒有必要再去麻煩的輸入else部分。
[code language="php"]
$x = 10;
if( this condition )
{
$x = 5;
}
[/code]
在代碼的空間節省上好像沒有太大的不同,如果在你的程序中有許多else語句的話,這樣會明顯的不同。
4.省略掉括號Dropping brackets saves space and time in your code.
就像在寫else語句時那樣,你也可以在通過省略掉在緊跟在一個控制語句中的的表達式中的括號來節省來節省一些字符。Evolt.org有一個簡單的例子列出了一個省略括號的結構
[code language="php"]
if ($gollum == 'halfling') {
$height --;
}
[/code]
這個和下面的一樣:
[code language="php"]
if ($gollum == 'halfling') $height --;
[/code]
甚至你可以用在復雜的情況
[code language="php"]
if ($gollum == 'halfling') $height --;
else $height ++;
if ($frodo != 'dead')
echo 'Gosh darnit, roll again Sauron';
foreach ($kill as $count)
echo 'Legolas strikes again, that makes' . $count . 'for me!';
[/code]
5選擇str_replace而不是ereg_replace和preg_replaceSpeed tests show that str_replace() is 61% faster.
從效率的角度來看,在替換字符串方面 str_replace()比正則表達式更高效。實際上,根據Making the Web所說,str_replace()比像ereg_replace()和 preg_replace()這樣的正則表達式效率要高61%。
如果你正在使用正則表達式的話,ereg_replace() 和preg_replace()會比str_replace()快很多。
6. 使用三元操作符考慮使用三元操作符來代替完全使用 if/else語句。PHP Value給了一個非常好的例子來說明三元操作符是什麼
[code http://www.yeeyan.com/articles/tag/php" target=_blank $included="null">php
//PHP COde Example usage for: Ternary Operator
$todo = (empty($_POST[’todo’])) ? ‘default’ : $_POST[’todo’];
// The above is identical to this if/else statement
if (empty($_POST[’todo’])) {
$action = ‘default’;
} else {
$action = $_POST[’todo’];
}
?>
[/code]
三元操作符節省了你的行空間,而且讓你的代碼不是那麼混亂,方便浏覽。注意不要在一個表達式語句中使用多於一個三元操作符,因為PHP並不是永遠都知道在這種情況下應該怎麼做。
7 memcachedMemcached is an excellent database caching system to use with PHP.
雖然有很多緩存方案可供選擇,Memcached做為最高效的數據庫緩存名列前茅。它不是執行起來最簡單的緩存系統,但是如果你用php搭建一個網站使用數據庫的話,Memcached肯定能夠加速你的網站。Memcached這個緩存系統第一次是為了LiveJournal這個blog網站而搭建的。
PHP.net有一個優秀的教程來介紹如何在你的項目中安裝和使用memcached。
8.使用一個框架CakePHP is one of the top PHP frameworks.
你可能不能在你的每個項目中使用PHP框架,但是像 CakePHP, Zend, Symfony and CodeIgniter這些框架可以大大的減少你構建一個網站的時間。框架是一個通過包裝常用的機制來提高發展速度的軟件。框架可以用來幫助減少開發網絡應用程序和網絡服務的開銷。
如果在編寫一個網站的時候你可以通過框架來打理反復的工作,你會更高速度的進行開發。寫越少的代碼,就會更少的進行調試和除錯。
9.正確的使用抑制錯誤操作符錯誤抑制操作符(或者在php手冊中叫做錯誤控制符)是@這個符號,當在PHP中放在一個語句前面的時候,它只是簡單的告訴程序不要(原文中此處為 now,估計為原作者筆誤)顯示這條語句產生的任何錯誤。如果你對這個值不確定或者不想拋出任何錯誤的話,這個操作符非常有用。
然而,很多程序員錯誤的使用錯誤抑制操作符。如果寫代碼時你把運行效率謹記在心的話,這個@操作符非常的慢而且運行代價很高。
Michel Fortin有一些例子來說明如何用其他方法來回避@這個錯誤抑制操作符。這是一個他使用isset這個函數 來替代錯誤印制操作符的方法。
[code language="php"]
if (isset($albus)) $albert = $albus;
else $albert = NULL;
[/code]
等同於:
[code language="php"]
$albert = @$albus;
[/code]
但是雖然第二種方法比較有條理的,但是運行速度要慢兩倍左右。一個好的解決方法是通過引用來分配變量,這樣不會觸發任何警告,例如:
[code language="php"]
$albert = &$albus;
[/code]
需要特別指出的是,這些改變可能會產生一些意外的副作用,應該用到對效率要求比較高的那些不會受到影響的地方。
10.使用isset代替strlenSwitching isset for strlen makes calls about five times faster.
如果你正在准備檢查一個字符串的長度,用isset來代替strlen。通過使用isset,你的調用會快五倍。需要指出的是,通過使用isset,如果變量不存在的話,你的調用也會有效。
D-talk有個例子介紹如何swap out isset for strlen:
A while ago I had a discussion about the optimal way to determine a string length in PHP. The obvious way is to use strlen().
However to check the length of a minimal requirement it’s actually not that optimal to use strlen. The following is actually much faster (roughly 5 times)
這只是一個小變化,但是像今天所講到的這些技巧,加起來就會成就一個快速,干淨的代碼。
[via 10 Advanced PHP Tips To Improve Your Programming]