转载于: http://www.yeeyan.com/articles/view/blankyao/18192?orgin=index
蝈蝈龙整理
自从PHP在1995年诞生就快速的成长。此后,php已经成为web应用中最流行的编程语言。许多流行的网站都是由php驱动,而且大多数的脚本和网络程序都是由这个流行语言编写的。
由于PHP的盛行,使网络开发者几乎不可能不懂一点的PHP知识。这个教程针对的是那些只是经历了PHP的初级阶段,并且准备卷起袖子,深入进去这个语言的人。下面列出的是PHP开发者应该学习并且在每次编程时使用的十条优秀的技术。这些经验能够加速开发者精通并且让代码更易感知的、整洁而且对代码执行来说更优化。
1.避免SQL注入攻击
SQL注入攻击是一个险恶的行为,SQL注入攻击是一个可以让黑客利用代码的弱点进入你的数据库的安全漏洞利用。虽然这篇文章不是Mysql相关的,但是很多PHP程序员都是用的Mysql数据库,所以如果你想写安全的代码的话学习如何避免(SQL注入)是很容易的。
Furruh Mavituna有一个很好的
SQL injection cheat sheet,里面有一部分是关于PHP和Mysql编程的弱点的。如果你能避免这个cheat sheet指出的习惯,你的代码会变得更少的易于脚本攻击。
2. 理解比较操作符之间的不同
比较操作符是php重要的部分,但是很多程序员不能很好地区分他们之间的差异。 比如理解===和==的区别是非常有用的。本质上,==是值相等,PHP强制格式化双方为相等的类型。如1=='1'(true)。
而 === 是比较类型和值精确一致,如1==='1'(false). 这个问题在很多函数应用上有所体现。如strpos(),当返回子串的位置为0或者没找到该字符串时,使用==将无法将0和FALSE进行区分。这时候就需要用到===. 你可以在PHP.net上找到比较操作符的完全列表。
3.让else语句更简洁
需要声明的是第3条和第4条都有点让代码的可读性降低,这两条强调的是速度和执行。如果你选择不牺牲可读性,那么你可以略过这两条。
可以让代码更简单更小的任何事情通常都是一个好习惯。这条的目的是将“中间人”从else语句中拿出来,Christian Montoya有一个非常好的用短的else语句来减少字符的例子:
一般的else语句
if( this condition ){
$x = 5;
} else {
$x = 10;
}
如果$x默认的是10,将它初始化为10就 可以了。没有必要再去麻烦的输入else部分。
$x = 10;
if( this condition ){
$x = 5;
}
在代码的空间节省上好像没有太大的不同,如果在你的程序中有许多else语句的话,这样会明显的不同。
4.省略掉括号
像在写else语句时那样,你也可以在通过省略掉在紧跟在一个控制语句中的的表达式中的括号来节省来节省一些字符。Evolt.org有一个简单的例子列出了一个省略括号的结构
if ($gollum == 'halfling') {
$height --;
}
这个和下面的一样:
if ($gollum == 'halfling') $height --;
甚至你可以用在复杂的情况
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!';
5. 尽量使用str_replace而不是ereg_replace和preg_replace
从效率的角度来看,在替换字符串方面 str_replace()比正则表达式更高效。实际上,根据
Making the Web所说,str_replace()比像ereg_replace()和 preg_replace()这样的正则表达式效率要高61%。
如果你正在使用正则表达式的话,ereg_replace() 和preg_replace()会比str_replace()快很多。
6. 使用三元操作符
考虑使用三元操作符来代替完全使用 if/else语句。PHP Value给了一个非常好的例子来说明三元操作符是什么
<?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’];
}
?>
三元操作符节省了你的行空间,而且让你的代码不是那么混乱,方便浏览。注意不要在一个表达式语句中使用多于一个三元操作符,因为PHP并不是永远都知道在这种情况下应该怎么做。
7. 使用Memcached
虽然有很多缓存方案可供选择,
Memcached做为最高效的数据库缓存名列前茅。它不是执行起来最简单的缓存系统,但是如果你用php搭建一个网站使用数据库的话,Memcached肯定能够加速你的网站。Memcached这个缓存系统第一次是为了LiveJournal这个blog网站而搭建的。
PHP.net有一个
优秀的教程来介绍如何在你的项目中安装和使用memcached。
8.使用一个框架
你可能不能在你的每个项目中使用PHP框架,但是像
CakePHP,
Zend, Symfony and CodeIgniter这些框架可以大大的减少你构建一个网站的时间。框架是一个通过包装常用的机制来提高发展速度的软件。框架可以用来帮助减少开发网络应用程序和网络服务的开销。
如果在编写一个网站的时候你可以通过框架来打理反复的工作,你会更高速度的进行开发。写越少的代码,就会更少的进行调试和除错。
9.正确的使用抑制错误操作符
错误抑制操作符(或者在php手册中叫做错误控制符)是@这个符号,当在PHP中放在一个语句前面的时候,它只是简单的告诉程序不要(原文中此处为 now,估计为原作者笔误)显示这条语句产生的任何错误。如果你对这个值不确定或者不想抛出任何错误的话,这个操作符非常有用。
然而,很多程序员错误的使用错误抑制操作符。如果写代码时你把运行效率谨记在心的话,这个@操作符非常的慢而且运行代价很高。
Michel Fortin有一些例子来说明如何用其他方法来回避@这个错误抑制操作符。这是一个他使用isset这个函数 来替代错误印制操作符的方法。
if (isset($albus)) $albert = $albus;
else $albert = NULL;
等同于:
$albert = @$albus;
但是虽然第二种方法比较有条理的,但是运行速度要慢两倍左右。一个好的解决方法是通过引用来分配变量,这样不会触发任何警告,例如:
$albert = & $albus;
需要特别指出的是,这些改变可能会产生一些意外的副作用,应该用到对效率要求比较高的那些不会受到影响的地方。
10.(某些场合下)使用isset()代替strlen()
如果你正在准备检查一个字符串的长度,某些情况下,可以用isset来代替strlen。通过使用isset,你的调用会快五倍。需要指出的是,通过使用isset,如果变量不存在的话,你的调用也会有效。
例如,当你检查字符串的最小长度时,使用下面的代码
<?php $str = 'This is a string'; if (isset($str[9])) { echo 'The input is longer or equal then 10 characters.'; } else { echo 'The input is less then 10 characters long.'; } ?>
替换
<?php $str = 'This is a string'; echo strlen($str); // 16 ?>
更有效率。
isset的另一个好处是能够检查变量是否存在,而strlen不能
<?php if (strlen($fubar) >= 10) { // Will throw E_NOTICE warning, since $fubar is not set. echo 'The input is longer or equal then 10 characters.'; } else { echo 'The input is less then 10 characters long.'; } ?>
笔者注: 这个条目大可忽略,太琐碎
这只是一个小变化,但是像今天所讲到的这些技巧,加起来就会成就一个效率更高的、干净的代码。