分享:php小技巧的使用记录
[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/103/ ]
这篇文章主要分享一些实用的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','<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),'<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
<?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);
第一个参数是创建目录的路径,第二个参数是创建目录的权限,第三个参数就是递归的开关。
未完待续。。。
我来说两句: