1. 使用list来实现一次获取explode后的特定段值:

    list( , $mid) = explode(';', $string);

  2. 使用NULL === 来代替is_null:

    is_null和 NULL === 完全是一样的效果, 但是却节省了一次函数调用.

  3. 使用=尽量不用:

    PHP有俩组相等比较运算符=/!和/!=, /!=会有隐式类型转换,而=/!会严格比较俩个操作时是否类型相同并且值相等.

    我们应该尽量使用=而不是, 除了因为转换规则比较难记以外, 还有一点就是如果使用===, 对于日后的维护或者阅读你代码的人也会很舒服:”在这个时刻, 这一行语句, 这个变量就是这个类型的!”.

  4. 少用/不用 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提供了第三个可选的参数, 通过这个参数可以改变默认的比较方式.

  1. switch不仅仅只用来判别变量:

    比如, 对于如下的一段代码:

if($a) {

} else if ($b) {

} else if ($c || $d) {

}

可以简单的改写为:

switch (TRUE) {

case $a:

break;

case $b:

break;

case $c:

case $d:

break;

}

是不是看起来更清晰呢?

  1. 变量先定义后使用:

    使用一个未定义的变量, 比使用一个定义好的变量要慢8倍以上!

可以相像, PHP引擎会首先按照正常的逻辑来获取这个变量, 然而这个变量不存在, 所以PHP引擎需要抛出一个NOTICE, 并且进入一段使用未定义变量时应该走的逻辑, 然后返回一个新的变量.

另外, 阅读代码的角度讲, 当你使用一个未定义的变量时, 会让阅读你代码的人困惑:”这个变量在那里初始化的, 和之前的代码有关系么? 和include进来的文件有关系么?”

最后, 从规范编程的角度来讲, 你也需要这样做.

  1. 不用第三变量交换俩个变量的值:

    list($a, $b) = array($b, $a),

    但其实还是有匿名临时变量的产生, 对于整数来说, 采用互逆的运算来做, 还是比较靠谱:

    $a = $a + $b;

    $b = $a - $b;

    $a = $a - $b;

    不过, 还是用异或比较好, 因为+ – * /容易产生精度丢失或者溢出.

  2. floor == 俩次非运算(此条由skiyo提供)

    echo ~~4.9;

    echo floor(4.9);

    用俩次非运算的速度基本上是floor的3倍, 不过有一点, 对于大数来说, 可能会发生溢出:

    echo ~~99999999999999.99; //276447231

    echo floor(99999999999999.99); //99999999999999

  3. 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 {

}

  1. 尽量少用@错误抑制符

    如下代码:

@func();

就相当于(参见深入理解PHP原理之错误抑制与内嵌HTML):

$report = error_reporting(0);

func();

error_reporting($report);

另外错误抑制符号, 可能会造成一些问题, 参看(PHP错误抑制符(@)导致引用传参失败的Bug);

最后,错误抑制符在发生错误调试的时候也可能会带来麻烦.

  1. 尽量避免使用递归(此条来自lazyboy)

    递归性能堪忧, 而大部分的递归都是尾递归, 都是可以消除的.

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']代替, 快很多.

  1. 避免在for判断条件中做运算(此条来自留言的Anonymous)

    如下的代码:

for($i=0; $i<strlen($str); $i++) {

}

会导致每次循环都调用strlen, 改为

for ($i=0, $j=strlen($str); $i<$j; $i++) {

}

  1. 尽量避免使用正则(此条来自pangyontao)

    正则耗时, 尽量避免, 而采用直接的字符串处理函数代替, 如:

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) {}

  1. 用大括号括起在双引号和heredoc中的变量

    如下的代码:

echo "$name[2]";

PHP不知道程序员的意图是$name . “[2]“还是$name[2],

所以建议, 都加上大括号:

echo "{$name}[2]";

//或者

echo "${name}[2]";

  1. 用FALSE表示错误, 用NULL表示不存在.

    对于操作类的函数, 失败返回FALSE, 表示”操作失败了”, 而对于查询类的函数, 如果找不到想要的值, 则应该返回NULL, 表示”找不到”.

18..输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。

注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”

(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

19.

当操作字符串并需要检验其长度是否满足某种要求时,

你想当然地会使用strlen()函数。此函数执行起来相当快,

因为它不做任何计算,只返回在zval 结构(C的内置数据结构,

用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,

多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化

(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。

在某些情况下,你可以使用isset() 技巧加速执行你的代码。

(举例如下)

if (strlen($foo) < 5) { echo “Foo is too short”; }

(与下面的技巧做比较)

if (!isset($foo)) { echo “Foo is too short”; }

调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,

意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

20.当执行变量$i的递增或递减时,$i++会比++$i慢一些。

这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,

没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。

后置递增实际上会产生一个临时变量,这个临时变量随后被递增。

而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。

牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,

并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

21.尽量采用大量的PHP内置函数。

22.如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。

23、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。

Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈.同样你也可以使用目前非常cool的由facebook开发的xhprof来做分析。

php之code tips的更多相关文章

  1. Visual Studio Code Tips

    新项目要用到Visual Studio Code, 在使用的过程中有些tips, 记录下来以便查阅. 1. 自动保存代码 文件 => 自动保存 2. 帮助输入代码模式 扩展 => 安装HT ...

  2. SQL Server Code tips (持续更新)

    1.  表存在,查询语句也能执行,但是表名下面总是有条红线,说对象名无效 CTRL + SHIFT +R  刷新本地缓存就可以了 2. IDE (Integrated Development Envi ...

  3. [notes] some code tips

    genericizing-codehtml, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin ...

  4. [Tools] VS Code Tips

    Inside one file, you can freely mark the number 1-9: -] And jump to Number of bookmark: cmd + [-] It ...

  5. jquery提示信息 tips

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. visual code golang配置

    前言 其实环境搭建没什么难的,但是遇到一些问题,主要是有些网站资源访问不了(如:golang.org), 导致一些包无法安装,最终会导致环境搭建失败,跟据这个教程几步,我们将可以快速的构建golang ...

  7. VS Code开发技巧集锦

    2016 年 9 月 23-24 日,由 CSDN 和创新工场联合主办的“MDCC 2016 移动开发者大会? 中国”(Mobile Developer Conference China)将在北京? ...

  8. 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server

    原文转自 http://www.cnblogs.com/ldms/p/4565547.html Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后 ...

  9. (转) The major advancements in Deep Learning in 2016

    The major advancements in Deep Learning in 2016 Pablo Tue, Dec 6, 2016 in MACHINE LEARNING DEEP LEAR ...

随机推荐

  1. C# 给枚举类型增加一个备注特性

    /// <summary> /// 备注特性 /// </summary> public class RemarkAttribute : Attribute { /// < ...

  2. PX4/PixHawk无人机飞控应用开发

    最近做的一个国防背景的field UAV项目,细节不能多谈,简单写点技术体会. 1.PX4/Pixhawk飞控软件架构简介 PX4是目前最流行的开源飞控板之一.PX4的软件系统实际上就是一个firmw ...

  3. 修改/dev/shm的大小

    修改/dev/shm的大小 修改/etc/fstab的这行: 默认的:tmpfs /dev/shm tmpfs defaults 0 0改成:tmpfs /dev/shm tmpfs defaults ...

  4. MXNET:监督学习

    线性回归 给定一个数据点集合 X 和对应的目标值 y,线性模型的目标就是找到一条使用向量 w 和位移 b 描述的线,来尽可能地近似每个样本X[i] 和 y[i]. 数学公式表示为\(\hat{y}=X ...

  5. (转)java 中unsigned类型的转换

    转自:http://blog.sina.com.cn/s/blog_77bf45a90101dld9.html 在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned ...

  6. MySQL数据库远程访问权限如何打开(两种方法)

    在我们使用mysql数据库时,有时我们的程序与数据库不在同一机器上,这时我们需要远程访问数据库.缺省状态下,mysql的用户没有远程访问的权限. 下面介绍两种方法,解决这一问题. 1.改表法 可能是你 ...

  7. easyradius隆重发布ROS API计费接口,支持ROS 3.3以上版本,实现简单快捷的ROS宽带计费系统云端版

    easyradius对接ROS也是使用的是ROS的api接口,即您要开启 /ip /service api服务,不了解api接口的,可以自己百度噢 开启API,就到easyradius配置通讯接口,具 ...

  8. rem布局在react中的应用

    摘要: 前面给大家分享了一个react项目(http://www.cnblogs.com/xiyangbaixue/p/4751904.html),这次对这个项目做了一些改进,增加了rem布局和对is ...

  9. 12外观模式Facade

    一.什么是外观模式 Facade模式也叫外观模式,是由GoF提出的 23种设计模式中的一种.Facade模式为一组具 有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面.这个一致的简单的 ...

  10. 深入Java内存模型之阅读理解(2)

    锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息. 下面是锁释放-获取的示例代 ...