PHP教程:9个有用的PHP函数-Php-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝27
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:174回复:0

  PHP教程:9个有用的PHP函数

楼主#
更多 发布于:2016-05-31 16:48

9 个有必要知道的有用 PHP 函数和功用.

即便运用 PHP

多年,也会偶尔发现一些未曾了解的函数和功用。其间有些对错常有用的,但没有得到充分运用。并不是所有人都会从头到尾一页一页地阅览手册和函数参阅!

1、恣意参数数意图函数

你也许现已知道,PHP

允许界说可选参数的函数。但也有彻底允许恣意数意图函数参数的办法。以下是可选参数的比如:

// function with 2 optional argumentsfunction

foo($arg1 = '', $arg2 = '') {echo "arg1: $arg1\n";echo "arg2:

$arg2\n";}foo('hello','world');/* prints:arg1: helloarg2: world*/foo();/*

prints:arg1:arg2:*/

如今让咱们看看怎么树立能够承受任何参数数意图函数。这一次需求运用 func_get_args()

函数:

// yes, the argument list can be emptyfunction

foo() {// returns an array of all passed arguments$args =

func_get_args();foreach ($args as $k => $v) {echo "arg".($k+1).":

$v\n";}}foo();/* prints nothing */foo('hello');/* printsarg1:

hello*/foo('hello', 'world', 'again');/* printsarg1: helloarg2: worldarg3:

again*/

2、运用 Glob() 查找文件

很多 PHP 函数具有长描述性的称号。可是也许会很难说出 glob()

函数能做的工作,除非你现现已过屡次运用并熟悉了它。能够把它看作是比 scandir() 函数更强壮的版本,能够依照某种形式查找文件。

// get all php files$files =

glob('*.php');print_r($files);/* output looks like:Array(    [0] =>

phptest.php    [1] => pi.php    [2] => post_output.php    [3] =>

test.php)*/

你能够像这么取得多个文件:

// get all php files AND txt files$files =

glob('*.{php,txt}', GLOB_BRACE);print_r($files);/* output looks like:Array(  

 [0] => phptest.php    [1] => pi.php    [2] => post_output.php    [3]

=> test.php    [4] => log.txt    [5] => test.txt)*/

请注意,这些文件其实是能够回来一个途径,这取决于查询条件:

$files =

glob('../images/a*.jpg');print_r($files);/* output looks like:Array(    [0]

=> ../images/apple.jpg    [1] => ../images/art.jpg)*/

假如你想取得每个文件的完好途径,你能够调用 realpath() 函数:

$files = glob('../images/a*.jpg');// applies the

function to each array element$files =

array_map('realpath',$files);print_r($files);/* output looks like:Array(    [0]

=> C:\wamp\www\images\apple.jpg    [1] =>

C:\wamp\www\images\art.jpg)*/

3、内存运用信息

经过侦测脚本的内存运用状况,有利于代码的优化。PHP

供给了一个废物收集器和一个十分杂乱的内存管理器。脚本履行时所运用的内存量,有升有跌。为了得到当时的内存运用状况,咱们能够运用

memory_get_usage() 函数。假如需求取得恣意时刻点的最高内存运用量,则能够运用 memory_limit() 函数。

echo "Initial: ".memory_get_usage()." bytes \n";/*

printsInitial: 361400 bytes*/// let's use up some memoryfor ($i = 0; $i <

100000; $i++) {$array []= md5($i);}// let's remove half of the arrayfor ($i = 0;

$i < 100000; $i++) {unset($array[$i]);}echo "Final: ".memory_get_usage()."

bytes \n";/* printsFinal: 885912 bytes*/echo "Peak: ".memory_get_peak_usage()."

bytes \n";/* printsPeak: 13687072 bytes*/

4、CPU 运用信息

为此,咱们要运用 getrusage() 函数。请记住这个函数不适用于 Windows

渠道。

print_r(getrusage());/* printsArray(  

 [ru_oublock] => 0    [ru_inblock] => 0    [ru_msgsnd] => 2  

 [ru_msgrcv] => 3    [ru_maxrss] => 12692    [ru_ixrss] => 764  

 [ru_idrss] => 3864    [ru_minflt] => 94    [ru_majflt] => 0  

 [ru_nsignals] => 1    [ru_nvcsw] => 67    [ru_nivcsw] => 4  

 [ru_nswap] => 0    [ru_utime.tv_usec] => 0    [ru_utime.tv_sec] => 0  

 [ru_stime.tv_usec] => 6269    [ru_stime.tv_sec] => 0)*/

这也许看起来有点奥秘,除非你现已有体系管理员权限。以下是每个值的详细说明(你不需求记住这些):

ru_oublock: block output operationsru_inblock:

block input operationsru_msgsnd: messages sentru_msgrcv: messages

receivedru_maxrss: maximum resident set sizeru_ixrss: integral shared memory

sizeru_idrss: integral unshared data sizeru_minflt: page reclaimsru_majflt: page

faultsru_nsignals: signals receivedru_nvcsw: voluntary context

switchesru_nivcsw: involuntary context switchesru_nswap: swapsru_utime.tv_usec:

user time used (microseconds)ru_utime.tv_sec: user time used

(seconds)ru_stime.tv_usec: system time used (microseconds)ru_stime.tv_sec:

system time used (seconds)

要知道脚本耗费多少 CPU 功率,咱们需求看看 ‘user time’ 和 ’system

time’ 两个参数的值。秒和微秒部分默许是独自供给的。你能够除以 100 万微秒,并加上秒的参数值,得到一个十进制的总秒数。让咱们来看一个比如:

// sleep for 3 seconds (non-busy)sleep(3);$data =

getrusage();echo "User time: ".($data['ru_utime.tv_sec']

+$data['ru_utime.tv_usec'] / 1000000);echo "System time:

".($data['ru_stime.tv_sec'] +$data['ru_stime.tv_usec'] / 1000000);/* printsUser

time: 0.011552System time: 0*/

虽然脚本运转用了大概 3 秒钟,CPU

运用率却十分十分低。因为在睡觉运转的过程中,该脚本实践上不耗费 CPU 资本。还有很多别的的使命,也许需求一段时刻,但不占用相似等待磁盘操作等 CPU

时刻。因而正如你所看到的,CPU 运用率和运转时刻的实践长度并不总是一样的。下面是一个比如:

// loop 10 million times

(busy)for($i=0;$i<10000000;$i++) {}$data = getrusage();echo "User time:

".($data['ru_utime.tv_sec'] +$data['ru_utime.tv_usec'] / 1000000);echo "System

time: ".($data['ru_stime.tv_sec'] +$data['ru_stime.tv_usec'] / 1000000);/*

printsUser time: 1.424592System time: 0.004204*/

这花了大概 1.4 秒的 CPU

时刻,但几乎都是用户时刻,因为没有体系调用。体系时刻是指花费在履行程序的体系调用时的 CPU 开支。下面是一个比如:

$start = microtime(true);// keep calling microtime

for about 3 secondswhile(microtime(true) - $start < 3) {}$data =

getrusage();echo "User time: ".($data['ru_utime.tv_sec']

+$data['ru_utime.tv_usec'] / 1000000);echo "System time:

".($data['ru_stime.tv_sec'] +$data['ru_stime.tv_usec'] / 1000000);/* printsUser

time: 1.088171System time: 1.675315*/

如今咱们有相当多的体系时刻占用。这是因为脚本屡次调用 microtime()

函数,该函数需求向操作体系宣布恳求,以获取所需时刻。你也也许会注意到运转时刻加起来不到 3 秒。这是因为有也许在服务器上一起存在别的进程,而且脚本没有 100%

运用 CPU 的全部 3 秒持续时刻。

5、戏法常量

PHP 供给了获取当时行号 (__LINE__)、文件途径 (__FILE__)、目录途径

(__DIR__)、函数名 (__FUNCTION__)、类名 (__CLASS__)、办法名 (__METHOD__) 和命名空间

(__NAMESPACE__) 等有用的戏法常量。在这篇文章中不作逐个介绍,可是我将通知你一些用例。当包括别的脚本文件时,运用 __FILE__ 常量(或许运用

PHP5.3 新具有的 __DIR__ 常量):

// this is relative to the loaded script's path//

it may cause problems when running scripts from different

directoriesrequire_once('config/database.php');// this is always relative to

this file's path// no matter where it was included

fromrequire_once(dirname(__FILE__) . '/config/database.php');

运用 __LINE__ 使得调试更为轻松。你能够盯梢到详细行号。

// some code// ...my_debug("some debug message",

__LINE__);/* printsLine 4: some debug message*/// some more code//

...my_debug("another debug message", __LINE__);/* printsLine 11: another debug

message*/function my_debug($msg, $line) {echo "Line $line: $msg\n";}

6、生成仅有标识符

某些场景下,也许需求生成一个仅有的字符串。我看到很多人运用 md5()

函数,即便它并不彻底意味着这个意图:

// generate unique stringecho md5(time() .

mt_rand(1,1000000));

There is actually a PHP function named uniqid()

that is meant to be used for this.

// generate unique stringecho uniqid();/*

prints4bd67c947233e*/// generate another unique stringecho uniqid();/*

prints4bd67c9472340*/

你也许会注意到,虽然字符串是仅有的,前几个字符却是相似的,这是因为生成的字符串与服务器时刻有关。但实践上也存在友爱的一方面,因为每个新生成的

ID 会按字母顺序排列,这么排序就变得很简单。为了削减重复的概率,你能够传递一个前缀,或第二个参数来增加熵:

// with prefixecho uniqid('foo_');/*

printsfoo_4bd67d6cd8b8f*/// with more entropyecho uniqid('',true);/*

prints4bd67d6cd8b926.12135106*/// bothecho uniqid('bar_',true);/*

printsbar_4bd67da367b650.43684647*/

这个函数将发生比 md5() 更短的字符串,能节约一些空间。

7、序列化

你有没有遇到过需求在数据库或文本文件存储一个杂乱变量的状况?你也许没能想出一个格式化字符串并转换成数组或目标的好办法,PHP

现已为你准备好此功用。有两种序列化变量的流行办法。下面是一个比如,运用 serialize() 和 unserialize() 函数:

// a complex array$myvar =

array('hello',42,array(1,'two'),'apple');// convert to a string$string =

serialize($myvar);echo $string;/*

printsa:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";}*///

you can reproduce the original variable$newvar =

unserialize($string);print_r($newvar);/* printsArray(    [0] => hello    [1]

=> 42    [2] => Array        (            [0] => 1            [1] =>

two        )    [3] => apple)*/

这是原生的 PHP 序列化办法。可是,因为 JSON 这些年大受欢迎,PHP5.2 中现已加入了对

JSON 格式的支撑。如今你能够运用 json_encode() 和 json_decode() 函数:

// a complex array$myvar =

array('hello',42,array(1,'two'),'apple');// convert to a string$string =

json_encode($myvar);echo $string;/* prints["hello",42,[1,"two"],"apple"]*/// you

can reproduce the original variable$newvar =

json_decode($string);print_r($newvar);/* printsArray(    [0] => hello    [1]

=> 42    [2] => Array        (            [0] => 1            [1] =>

two        )    [3] => apple)*/

这将更为卓有成效,特别与 JavaScript

等很多别的言语兼容。可是关于杂乱的目标,某些信息也许会丢失。

8、紧缩字符串

在谈到紧缩时,咱们一般想到文件紧缩,如 ZIP 紧缩等。在 PHP

中字符串紧缩也是也许的,但不触及任何紧缩文件。鄙人面的比如中,咱们要运用 gzcompress() 和 gzuncompress() 函数:

$string ="Lorem ipsum dolor sit amet,

consecteturadipiscing elit. Nunc ut elit id mi ultriciesadipiscing. Nulla

facilisi. Praesent pulvinar,sapien vel feugiat vestibulum, nulla dui pretium

orci,non ultricies elit lacus quis ante. Lorem ipsum dolorsit amet, consectetur

adipiscing elit. Aliquampretium ullamcorper urna quis iaculis. Etiam ac massased

turpis tempor luctus. Curabitur sed nibh eu elitmollis congue. Praesent ipsum

diam, consectetur vitaeornare a, aliquam a nunc. In id magna pellentesquetellus

posuere adipiscing. Sed non mi metus, at laciniaaugue. Sed magna nisi, ornare in

mollis in, mollissed nunc. Etiam at justo in leo congue mollis.Nullam in neque

eget metus hendrerit scelerisqueeu non enim. Ut malesuada lacus eu nulla

bibendumid euismod urna sodales. ";$compressed = gzcompress($string);echo

"Original size: ". strlen($string)."\n";/* printsOriginal size: 800*/echo

"Compressed size: ". strlen($compressed)."\n";/* printsCompressed size: 418*///

getting it back$original = gzuncompress($compressed);

这种操作的紧缩率能到达 50% 左右。别的的函数 gzencode() 和 gzdecode()

能到达相似成果,经过运用不一样的紧缩算法。

9、注册中止功用

有一个函数叫做

register_shutdown_function(),能够让你在某段脚本完结运转之前,履行一些指定代码。假定你需求在脚本履行完毕前捕获一些基准统计信息,例如运转的时刻长度:

// capture the start time$start_time =

microtime(true);// do some stuff// ...// display how long the script tookecho

"execution took: ".(microtime(true) - $start_time)." seconds.";

这好像微不足道,你只需求在脚本运转的最终添加有关代码。可是假如你调用过 exit()

函数,该代码将无法运转。此外,假如有一个丧命的过错,或许脚本被用户意外中止,它也许无法再次运转。当你运用

register_shutdown_function() 函数,代码将持续履行,不管脚本是不是中止运转:

$start_time =

microtime(true);register_shutdown_function('my_shutdown');// do some stuff//

...function my_shutdown() {global $start_time;echo "execution took:

".(microtime(true) - $start_time)." seconds.";}

英文原稿:9 Useful PHP Functions and Features You Need

to Know | Nettuts

优质IT资源分享社区为你提供此文。

本站有大量优质php教程视频,资料等资源,包含php基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看

php教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客