十条PHP技巧来提升你的编程水平
自从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_replace
Speed 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 language="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 memcached
Memcached 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代替strlen
Switching 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)
这只是一个小变化,但是像今天所讲到的这些技巧,加起来就会成就一个快速,干净的代码。