php中函数支持的功能有,php常用函数大全
即使使用PHP多年,也会偶然发现一些不为人知的函数和功能。其中有些非常有用,但没有被充分利用。不是每个人都会从头到尾一页一页的看手册和功能参考!
1.具有任意数量参数的函数
您可能已经知道,PHP允许您用可选参数定义函数。但是也有一些方法完全允许任意数量的函数参数。以下是可选参数的示例:
//带有两个可选参数的函数
函数foo($arg1= ,$arg2=) {
echo arg 1:$ arg1n ;
echo arg 2:$ arg 2n ;
foo(hello , world );
/*印花:
你好
arg2:世界
foo();
/*印花:
arg1:
arg2:
*/
现在让我们看看如何构建一个可以接受任意数量参数的函数。这一次您需要使用func_get_args()函数:
//可以,参数列表可以为空
函数foo() {
//返回所有传递的参数的数组
$ args=func _ get _ args();
foreach ($args as $k=$v) {
echo arg 。($k 1)。$ VN ;
foo();
/*不打印任何内容*/
foo( hello );
/*印花
你好
foo(hello , world , again );
/*印花
你好
arg2:世界
arg3:再次
*/
2.使用Glob()查找文件。
许多PHP函数都有很长的描述性名称。但是,可能很难说glob()函数能做什么,除非你多次使用过它,并对它很熟悉。可以把它看作是比scandir()函数更强大的版本,可以按照一定的模式搜索文件。
//获取所有php文件
$files=glob(*。PHP’);
print _ r($ files);
/*输出如下所示:
排列
[0]=phptest.php
[1]=pi.php
[2]=post_output.php
[3]=test.php
*/
您可以获得多个文件,如下所示:
//获取所有php文件和txt文件
$files=glob(*。{php,txt} ,GLOB _ BRACE);
print _ r($ files);
/*输出如下所示:
排列
[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);
/*输出如下所示:
排列
[0]=./images/apple.jpg
[1]=./images/art.jpg
*/
如果想获得每个文件的完整路径,可以调用realpath()函数:
$files=glob(./images/a*。jpg’);
//将函数应用于每个数组元素
$files=array_map(realpath ,$ files);
print _ r($ files);
/*输出如下所示:
排列
[0]=C:wampwwwimagesapple.jpg
[1]=C:wampwwwimagesart.jpg
*/
3.内存使用信息
通过检测脚本的内存使用情况有助于优化代码。PHP提供了垃圾收集器和非常复杂的内存管理器。脚本执行期间使用的内存量有升有降。要获得当前的内存使用情况,我们可以使用memory_get_usage()函数。如果您需要在任何时间点获得最高的内存使用率,可以使用memory_limit()函数。
echo Initial:。memory_get_usage()。字节数n’;
/*印花
初始:361400字节
//让我们用掉一些内存
for($ I=0;10万美元;$i ) {
$ array[]=MD5($ I);
//让我们移除数组的一半
for($ I=0;10万美元;$i ) {
unset($ array[$ I]);
回声最终:。memory_get_usage()。字节数n’;
/*印花
最终:885912字节
回声“峰值:”。memory_get_peak_usage()。字节数n’;
/*印花
峰值:13687072字节
*/
4.CPU使用信息
为此,我们将利用getrusage()函数。请记住,该功能不适用于Windows平台。
print _ r(getrusage());
/*印花
排列
[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 _ n信号]=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:阻止输出操作
ru_inblock:阻塞输入操作
ru_msgsnd:发送的消息
ru_msgrcv:收到的消息
ru_maxrss:最大驻留集大小
ru_ixrss:整数共享内存大小
ru_idrss:整数非共享数据大小
ru_minflt:页面回收
ru_majflt:页面错误
ru _信号:接收的信号
ru_nvcsw:自愿上下文切换
ru_nivcsw:不自觉的上下文切换
ru_nswap:交换
ru_utime.tv_usec:用户使用的时间(微秒)
ru_utime.tv_sec:用户使用的时间(秒)
ru_stime.tv_usec:使用的系统时间(微秒)
ru_stime.tv_sec:使用的系统时间(秒)
为了知道脚本消耗了多少CPU资源,我们需要查看两个参数“usertime”和“system time”的值。默认情况下,秒和微秒是分开提供的。你可以把它除以100万微秒,加上参数值seconds,得到一个十进制的总秒数。让我们看一个例子:
//睡眠3秒钟(非忙碌)
睡眠(3);
$ data=getru sage();
回显“用户时间:”。
($data[ru_utime.tv_sec]
$ data[ ru _ utime . TV _ usec ]/1000000);
echo“系统时间:”。
($data[ru_stime.tv_sec]
$ data[ ru _ stime . TV _ usec ]/1000000);
/*印花
用户时间:0.011552
系统时间:0
*/
虽然脚本运行了大约3秒钟,但是CPU利用率非常非常低。因为在休眠的过程中,脚本并没有实际消耗CPU资源。还有许多其他任务可能需要一段时间,但不会占用CPU时间,例如等待磁盘操作。所以正如你所看到的,CPU使用和运行时间的实际长度并不总是相同的。下面是一个例子:
//循环1000万次(忙)
for($ I=0;10000000美元;$i ) {
$ data=getru sage();
回显“用户时间:”。
($data[ru_utime.tv_sec]
$ data[ ru _ utime . TV _ usec ]/1000000);
echo“系统时间:”。
($data[ru_stime.tv_sec]
$ data[ ru _ stime . TV _ usec ]/1000000);
/*印花
用户时间:1.424592
系统时间:0.004204
*/
大概用了1.4秒的CPU时间,但是因为没有系统调用,所以几乎都是用户时间。系统时间是指执行程序的系统调用所花费的CPU开销。下面是一个例子:
$ start=microtime(true);
//保持调用microtime大约3秒钟
while(microtime(true)-$ start 3){
$ data=getru sage();
回显“用户时间:”。
($data[ru_utime.tv_sec]
$ data[ ru _ utime . TV _ usec ]/1000000);
echo“系统时间:”。
($data[ru_stime.tv_sec]
$ data[ ru _ stime . TV _ usec ]/1000000);
/*印花
用户时间:1.088171
系统时间:1.675315
*/
现在我们有相当多的系统时间。这是因为脚本多次调用microtime()函数,需要向操作系统发出请求来获取所需的时间。您可能还会注意到,运行时间加起来不到3秒。这是因为服务器上可能同时存在其他进程,并且该脚本并不具有100% CPU使用率的整个3秒持续时间。
5.魔法常数
PHP提供了对当前行号(__LINE__)、文件路径(__FILE__)、目录路径(__DIR__)、函数名(__FUNCTION__)、类名(__CLASS__)、方法名(__METHOD__)和命名空间(_ _ namespace)的访问,本文我不会一一介绍,但我会告诉你一些用例。当包含其他脚本文件时,使用__FILE__常量(或PHP5.3中新的__DIR__常量):
//这是相对于加载脚本的路径
//当从不同目录运行脚本时,这可能会导致问题
require _ once( config/database . PHP );
//这总是相对于该文件的路径
//不管它是从哪里包含进来的
require_once(目录名(__文件_ _)。/config/database . PHP );
使用__LINE__使调试更容易。您可以跟踪具体的行号。
//一些代码
//.
my_debug(某个调试消息,_ _ LINE _ _);
/*印花
第4行:一些调试消息
//更多的代码
//.
my_debug(另一个调试消息,_ _ LINE _ _);
/*印花
第11行:另一条调试消息
函数my_debug($msg,$line) {
echo Line $ Line:$ msgn ;
}
6.生成唯一标识符
在某些情况下,可能需要生成一个唯一的字符串。我看到许多人使用md5()函数,即使它并不完全意味着这个目的:
//生成唯一的字符串
echo md5(时间()。mt _ rand(11000000);
实际上有一个名为uniqid()的服务器端编程语言(Professional Hypertext Preprocessor的缩写)函数就是用来做这个的。
//生成唯一的字符串
echo uniqid();
/*印花
4bd67c947233e
//生成另一个唯一的字符串
echo uniqid();
/*印花
4bd67c9472340
*/
你可能会注意到,尽管字符串是唯一的,前几个字符却是类似的,这是因为生成的字符串与服务器时间相关。但实际上也存在友好的一方面,由于每个新生成的身份会按字母顺序排列,这样排序就变得很简单。为了减少重复的概率,你可以传递一个前缀,或第二个参数来增加熵:
//带前缀
echo uniqid( foo _ );
/*印花
foo_4bd67d6cd8b8f
//有更多的熵
echo uniqid( ,true);
/*印花
d 6的4bd 67 cd8b 48660.68868688661
//两者都有
echo uniqid(bar_ ,true);
/*印花
酒吧_ 4bd 67 da 367 b 38667。366666666667
*/
这个函数将产生比md5()更短的字符串,能节省一些空间。
7、序列化
你有没有遇到过需要在数据库或文本文件存储一个复杂变量的情况?你可能没能想出一个格式化字符串并转换成数组或对象的好方法,PHP已经为你准备好此功能。有两种序列化变量的流行方法。下面是一个例子,使用序列化()和取消序列化()函数:
//复杂数组
$myvar=array(
你好,
数组(1, 2 ),
苹果公司
//转换为字符串
$ string=serialize($ myvar);
echo $ string
/*印花
答:4:{ I:0;学生5分钟你好;I:1;I:42;I:2;a:2:{ I:0;I:1;I:1;生:3:二;} I:3;学生5分钟苹果;}
//你可以重现原来的变量
$ new var=unserialize($ string);
print _ r($ new var);
/*印花
排列
[0]=你好
[1]=42
[2]=数组
[0]=1
[1]=两个
苹果公司
*/
这是原生的服务器端编程语言(专业超文本预处理器的缩写)序列化方法。然而,由于数据近年来大受欢迎,PHP5.2中已经加入了对数据格式的支持。现在你可以使用json_encode()和json_decode()函数:
//复杂数组
$myvar=array(
你好,
数组(1, 2 ),
苹果公司
//转换为字符串
$ string=JSON _ encode($ myvar);
echo $ string
/*印花
[你好,42,[1,二],苹果]
//你可以重现原来的变量
$ new var=JSON _ decode($ string);
print _ r($ new var);
/*印花
排列
[0]=你好
[1]=42
[2]=数组
[0]=1
[1]=两个
苹果公司
*/
这将更为行之有效,尤其与Java脚本语言等许多其他语言兼容。然而对于复杂的对象,某些信息可能会丢失。
8、压缩字符串
在谈到压缩时,我们通常想到文件压缩,如活力压缩等。在服务器端编程语言(专业超文本预处理器的缩写)中字符串压缩也是可能的,但不涉及任何压缩文件。在下面的例子中,我们要利用gz压缩()和gzuncompress()函数:
$string=
我想你会喜欢的,知道吗
肥胖精英。这是我最好的选择
肥胖Nulla facilisi .普雷森特垫座,
有一种说法是,
没有什么比这更好的了。测试用的胡乱文字
坐吧,肥胖精英理事会。阿利库姆
你是我们中的一员伊蒂亚姆AC马萨
sed turpis tempor luctus .Curabitur sed nibh eu elit
莫莉康格。简历表
或者是,aliquam a nunc .在id magna pellentesque
告诉我真相。我不知道,在拉西尼亚
奥格。大尼西岛,或在莫利斯岛
sed nunc .艾格在胡斯托在利奥刚果莫利斯。
在新的一年里
欧盟非埃尼姆。但是,如果你没有任何东西
我是euismod urna sodales .
$ compressed=gz压缩($ string);
回显"原始大小:"。strlen(string).n’;
/*印花
原始尺寸:800
回声压缩大小:。strlen(已压缩).n’;
/*印花
压缩尺寸:418
//找回它
$ original=gzun compress($ compressed);
这种操作的压缩率能达到50% 左右。另外的函数gzencode()和gzdecode()能达到类似结果,通过使用不同的压缩算法。
9、注册停止功能
有一个函数叫做register_shutdown_function(),可以让你在某个脚本结束运行之前执行一些指定的代码。假设您需要在脚本执行结束之前捕获一些基本的统计数据,比如运行时间:
//捕捉开始时间
$ start _ time=microtime(true);
//做些事情
//.
//显示脚本花费的时间
“echo”执行时间:。
(microtime(true) - $start_time)。
几秒钟。
这看起来微不足道,你只需要在脚本运行的最后添加相关代码。但是如果您调用了exit()函数,代码将不会运行。此外,如果出现致命错误,或者脚本被用户意外终止,它可能不会再次运行。使用register_shutdown_function()函数时,无论脚本是否停止运行,代码都将继续执行:
$ start _ time=microtime(true);
register _ shut down _ function( my _ shut down );
//做些事情
//.
函数my_shutdown() {
global $ start _ time
“echo”执行时间:。
(microtime(true) - $start_time)。
几秒钟。
原文:你需要知道的9个有用的PHP函数和特性 nettuts