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);
|
第一个参数是创建目录的路径,第二个参数是创建目录的权限,第三个参数就是递归的开关。