php小技巧的使用记录

http://mo2g.com/view/103/

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

1)字符串的拼接

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

1
2
3
4
5
<?php
$h  'hello' ;
$w  'world' ;
$a  $h  ' '  $w ;
$b  "{$h} {$w}" ;

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

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

2)echo的用法

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

1
2
3
4
5
6
<?php
$a  'aaa' ;
$b  'bbb' ;
define( 'BR' , '<br>' );
echo  $a  . BR .  $b  . BR;
echo  $a  , BR ,  $b  , BR;

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

点(.)耗时 0.90954804420471
逗号(,)耗时 0.78847479820251

3)strtr批量替换字符串

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

1
2
3
4
5
6
7
8
9
10
11
<?php
$hw  'helllo woorld' ;
 
$arr  array (
     'helllo'  =>  'hello' ,
     'woorld'  =>  'world'
);
$arr1  array ( 'helllo' , 'woorld' );
$arr2  array ( 'hello' , 'world' );
echo  strtr ( $hw , $arr ), '<br>' ;
echo  str_replace ( $arr1 , $arr2 , $hw ), '<br>' ;

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

strtr耗时(秒) 1.469339132309
str_replace耗时(秒) 2.2880499362946

4)strlen函数优化

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

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

1
2
3
4
5
6
7
8
<?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就会有如下代码。

1
2
<?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'],存储了请求开始时的时间戳

1
2
3
4
<?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函数只能简单的创建一个文件夹,所以自己写了一个实现递归创建目录的函数,代码如下:

1
2
3
4
5
6
7
8
9
10
function  createDir( $path ) {
     $dir  = dirname( $path );
     if is_dir ( $dir ) ) {
         if ( ! is_dir ( $path ) )  mkdir ( $path );
     else  {
         createDir( $dir );
         createDir( $path );
     }
     return  true;
}

后来才发现,mkdir函数就可以实现递归创建目录的功能,而且很方便,用法如下:

1
mkdir ( '/home/a/b/c/d/e/f' ,0775,true);

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值