php 小窍门,分享:php小技巧的使用记录

这篇文章主要分享一些实用的PHP技巧,并简单的对比一下相应的执行效率。

1)字符串的拼接

在PHP中,经常用点(.)这个符号把字符串变量拼接起来,其实也可以用双引号(")来完成拼接工作,而且这么做的效率会好一些。看一下例子:<?php

$h = 'hello';

$w = 'world';

$a = $h . ' ' . $w;

$b = "{$h} {$w}";

$a跟$b所存储的字符串完全一样,在相同条件下循环一百万次的的时间如下:

$a字符串拼接方式耗时0.47789597511292

$b字符串拼接方式耗时0.40132117271423

2)echo的用法

PHP手册中已经明确指出,它其实不是一个函数,是一个语言结构,  因此不一定要使用小括号来指明参数,而且小括还会限制它的灵活性。举个例子进行说明:<?php

$a = 'aaa';

$b = 'bbb';

define('BR','
');

echo $a . BR . $b . BR;

echo $a , BR , $b , BR;

上边的两种echo的用法,输出完全相同。这里提醒一下,逗号(,)的用法会比点(.)的效率要高一些,在相同条件下循环一百万次的的时间如下:点(.)耗时0.90954804420471

逗号(,)耗时0.78847479820251

3)strtr批量替换字符串

strtr、str_replace这两个函数的功能相似,都是用来替换字符串中的子字符串,请看下边的例子:<?php

$hw = 'helllo woorld';

$arr = array(

'helllo' => 'hello',

'woorld' => 'world'

);

$arr1 = array('helllo','woorld');

$arr2 = array('hello','world');

echo strtr($hw,$arr),'
';

echo str_replace($arr1,$arr2,$hw),'
';

字符串分别经过这两个函数处理之后,虽然都是输出相同的字符串,但从执行效率来看,应该能看出差别,在相同条件下循环一百万次的的时间如下:strtr耗时(秒)1.469339132309

str_replace耗时(秒)2.2880499362946

4)strlen函数优化

strlen函数用于获取字符串的长度,所以经常会用此函数来检验字符串的长度是否满足需求。因为strlen直接就返回在zval 结构(注:C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度,所以执行效率相当的快。然而strlen毕竟是函数,会耗费一定的资源执行底层操作。因此,在某些情况下我们可以使用isset函数(一种语言结构)来优化代码。

下边的代码,分别通过两种方式检测字符串变量$a的长度是否大于等于1<?php

$a = 'aa';

if( strlen($a) >= 1 ) echo 1;

else echo 0;

if( isset( $a[0] ) ) echo 1;

else echo 0;

在相同条件下循环一百万次的的时间对比如下:strlen耗时(秒)1.0694530010223

isset耗时(秒)0.295254945755

5)is_file、is_dir、file_exists三个函数的比较

is_file:检测是否为文件,也可以理解为检测文件是否存在

is_dir:检测是否为文件夹(目录),也可以理解为检测文件夹是否存在

file_exists:检测文件或目录是否存在

由此可见,file_exists像是整合了is_file与is_dir的功能。然而这个全能函数,有时会照成语义不明,举个例子:先判断是否存在文件夹data,不存在则创建,使用file_exists就会有如下代码。<?php

if( file_exists('data') ) mkdir('data');

但如果存在以data命名的文件,那么data文件夹也是无法被创建的,再从性能上来看,is_file、is_dir都是比较好的选择,在相同条件下循环十万次的的时间如下:

文件或目录存在:is_file耗时(秒)0.1402759552002

is_dir耗时(秒)0.14139914512634

file_exists耗时(秒)0.89975810050964

文件或目录不存在:is_file耗时(秒)3.8856680393219

is_dir耗时(秒)3.8879971504211

file_exists耗时(秒)3.8056240081787

6)time()函数的优化

自PHP5.1.0开始,新增了一个环境变量$_SERVER['REQUEST_TIME'],存储了请求开始时的时间戳<?php

$t1 = time();

$t2 = $_SERVER['REQUEST_TIME'];

if( $t1 == $t2 ) echo '$t1 == $t2';

如果没有特殊需求,建议用此变量替换time()函数,在相同条件下循环一百万次的时间如下:

$_SERVER['REQUEST_TIME']耗时(秒)0.3524649143219

time()耗时(秒)0.90400910377502

7)mkdir()函数的使用

很早以前,就以为mkdir函数只能简单的创建一个文件夹,所以自己写了一个实现递归创建目录的函数,代码如下:function createDir($path) {

$dir = dirname($path);

if( is_dir($dir) ) {

if( !is_dir($path) ) mkdir($path);

} else {

createDir($dir);

createDir($path);

}

return true;

}

后来才发现,mkdir函数就可以实现递归创建目录的功能,而且很方便,用法如下:mkdir('/home/a/b/c/d/e/f',0775,true);

第一个参数是创建目录的路径,第二个参数是创建目录的权限,第三个参数就是递归的开关。

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值