分享: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);

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

未完待续。。。

评论:

  1. 美股最新行情 回复2017年07月12日 07时14分
    磨者
    谢谢分享!不错的技巧~~

  2. 我来说两句:

      切换  

    磨途歌检测发现,您当前使用的浏览器版本过低,要想使用画板模式,请先更新浏览器

      切换  

    磨途歌随机验证码