10条PHP高级技巧,让你提高php效率。
1.使用一个SQL注射备忘单一个基本的原则就是,永远不要相信用户提交的数据。
另一个规则就是,在你发送或者存储数据时对它进行转义(escape)。
可以总结为:filter input, escape output (FIEO). 输入过滤,输出转义。
通常导致SQL注射漏洞的原因是没有对输入进行过滤,如下语句:
代码如下:
2.了解比较运算符之间的不同
例如,你使用strpos() 来检测在一个字符串中是否存在一个子串 (如果子串没有找到,函数将返回 FALSE ), 结果可能会导致错误:
代码如下:
3.减少else(Shortcut the else)
记住,在你使用变量前总是要先初始化它们。
考虑如下一个用来根据用户名来检测用户是否是管理员的条件语句:
代码如下:
4. 总是使用大括号
PS:原谅是“扔掉那些方括号 Drop Those Brackets”
根据本文的内容, 我们相应作者的意思应该是 “braces,” 而不是brackets. “Curly brackets” 可能有大括号的意思, 但是”brackets” 通常表示 “方括号”的意思。这个技巧应该被无条件的忽略,因为,没有大括号,可读性和可维护性被破坏了。
举一个简单的例子:
代码如下:
5. 尽量用str_replace() 而不是 ereg_replace() 和 preg_replace()
我们讨厌听到的否认的话,但是(原文)这个用于演示误用的小技巧导致了它试图避免的同样的滥用问题。(
We hate to sound disparaging, but this tip demonstrates the sort of misunderstanding that leads to the same misuse it's trying to prevent.)
很明显字符串函数比正则表达式函数在字符匹配方面更快速高效,但是作者糟糕地试图从失败中得出一个推论:
(FIX ME: It's an obvious truth that string functions are faster at string matching than regular expression functions, but the author's attempt to draw a corollary from this fails miserably:)
If you're using regular expressions, then ereg_replace() and preg_replace() will be much faster than str_replace().
Because str_replace() does not support pattern matching, this statement makes no sense. The choice between string functions and regular expression functions comes down to which is fit for purpose, not which is faster. If you need to match a pattern, use a regular expression function. If you need to match a string, use a string function.
6. 使用三重运算符
三元运算符的好处是值得讨论的. 下面是一行从最近我们进行的审计的代码中取出的:
代码如下:
7. Memcached
磁盘访问是慢速的,网络访问也是慢的,数据库通常使用这二者。
内存是很快的。使用本地缓存可以避免网络和磁盘访问的开销。结合这些道理,然后,你想到了memcached,一个“分布式内存对象缓存系统”,最初为基于Perl的博客平台LiveJournal开发的。
如果你的程序不是分布在多个服务器上,你可能并不需要memcached。单的缓存方法——序列化数据然后将它保存在一个临时文件中。例如 – 对每个请求可以消除很多多余的工作。事实上,这是我们考虑帮助我们的客户优化他们的应用程序时,低挂水果的类型。
什么是low-hanging fruit:
A fruit-bearing tree often contains some branches low enough for animals and humans to reach without much effort. The fruit contained on these lower branches may be not be as ripe or attractive as the fruit on higher limbs, but it is usually more abundant and easier to harvest. From this we get the popular expression “low hanging fruit”, which generally means selecting the easiest targets with the least amount of effort.
一种最简易且最通用的将数据缓存在内存的方式是使用APC中的共享类型辅助方法,APC是一个最初由我们的同事George Schlossnagle开发的缓存系统,考虑如下例子:
代码如下:
8. 使用框架
所有决定都会有结果的,我们喜欢框架——事实上,CakePHP 和 Solar 的主要开发者和我们一起在 OmniTI 工作—— 但是使用一个框架并不会奇迹般地使你在做的东西变得更好。
在十月份,我们的同事Paul Jones为HP Advent写一了篇文章,叫做The Framework as Franchise ,在文章中他将框架与商业专营权相比较。他引用 Michael Gerber “电子神话再现”(”The E-Myth Revisited”) 一书中的建议:
格柏指出,运行一个成功的企业,企业家需要像他将要卖掉他的企业作为一个特许经营权的原型一样行动。这是企业拥有者可以不亲自参与每一项决策使企业运营的唯一方法。
( Gerber notes that to run a successful business, the entrepreneur needs to act as if he is going to sell his business as a franchise prototype. It is the only way the business owner can make the business operate without him being personally involved in every decision.)
这是一个好的建议。无论你是打算使用框架或者定义你自己的标签和惯例,从未来开发者的角度来看价值是很重要的。
虽然我们很乐意给你一个放之四海而皆准的真理,延伸这个想法来表明一个框架总是合适的,并不是我们想做的事情。
如果你问我们是否应该使用一个框架,我们可以给出的最好的答案是,“这要看情况。”
9. 正确的使用错误抑制操作符
总是试着避免使用错误抑制操作符号。在前面的文章,作者表明:
@ 操作符是相当的慢的并且如果你需要写高性能的代码的话它会使得开销很大。
错误抑制慢是因为在执行抑制语句前,PHP动态的改变error_reporting等级到0 ,然后然后立即将其还原。这是要开销的。
更糟糕的是,使用错误抑制符使追踪问题的根本原因很困难。
先前的文章使用如下例子来支持通过引用来给一个变量赋值的做法。。。(这句怎么翻译?我晕~~~ )
The previous article uses the following example to support the practice of assigning a variable by reference when it is unknown if $albus is set:
代码如下:
10. 使用 isset() 而不是 strlen()
这实际上是一个巧妙的方法,虽然前面的文章完全没有解释这个。下面是补充的例子:
代码如下:
本文原创发布php中文网,转载请注明出处,感谢您的尊重!