• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

九个你必须知道而且又很好用的php函数和特点_php技巧

php 搞代码 4年前 (2022-01-26) 28次浏览 已收录 0个评论

下面是九个PHP中很有用的功能,不知道你用过了吗?
1. 函数的任意数目的参数
你可能知道PHP允许你定义一个默认参数的函数。但你可能并不知道PHP还允许你定义一个完全任意的参数的函数
下面是一个示例向你展示了默认参数的函数:

// 两个默认参数的函数 <BR>function foo($arg1 = '', $arg2 = '') { <br><br>    echo "arg1: $arg1/n"; <BR>    echo "arg2: $arg2/n"; <br><br>} <br><br>foo('hello','world'); <BR>/* 输出: <BR>arg1: hello <BR>arg2: world <BR>*/<br><br>foo(); <BR>/* 输出: <BR>arg1: <BR>arg2: <BR>*/<BR>


现在我们来看一看一个不定参数的函数,其使用到了func_get_args()方法:

// 是的,形参列表为空 <BR>function foo() { <br><br>    // 取得所有的传入参数的数组 <BR>    $args = func_get_args(); <br><br>    foreach ($args as $k => $v) { <BR>        echo "arg".($k+1).": $v/n"; <BR>    } <br><br>} <br><br>foo(); <BR>/* 什么也不会输出 */<br><br>foo('hello'); <BR>/* 输出 <BR>arg1: hello <BR>*/<br><br>foo('hello', 'world', 'again'); <BR>/* 输出 <BR>arg1: hello <BR>arg2: world <BR>arg3: again <BR>*/<BR>



2. 使用 Glob() 查找文件
很多PHP的函数都有一个比较长的自解释的函数名,但是,当你看到glob() 的时候,你可能并不知道这个函数是用来干什么的,除非你对它已经很熟悉了。

你可以认为这个函数就好scandir() 一样,其可以用来查找文件。

// 取得所有的后缀为PHP的文件 <BR>$files = glob('*.php'); <br><br>print_r($files); <BR>/* 输出: <BR>Array <BR>( <BR>    [0] => phptest.php <BR>    [1] => pi.php <BR>    [2] => post_output.php <BR>    [3] => test.php <BR>) */<BR>你还可以查找多种后缀名<BR>// 取PHP文件和TXT文件 <BR>$files = glob('*.{php,txt}', GLOB_BRACE); <br><br>print_r($files); <BR>/* 输出: <BR>Array <BR>( <BR>    [0] => phptest.php <BR>    [1] => pi.php <BR>    [2] => post_output.php <BR>    [3] => test.php <BR>    [4] => log.txt <BR>    [5] => test.txt <BR>) <BR>*/<BR>


你还可以加上路径:

$files = glob('../images/a*.jpg'); <br><br>print_r($files); <BR>/* 输出: <BR>Array <BR>( <BR>    [0] => ../images/apple.jpg <BR>    [1] => ../images/art.jpg <BR>) <BR>*/<BR>


如果你想得到绝对路径,你可以调用realpath() 函数:

$files = glob('../images/a*.jpg'); <br><br>// applies the fun<mark style="color:transparent">本文来源gaodaimacom搞#^代%!码&网*</mark><pre>搞代gaodaima码

ction 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_get_peak_usage() 函数。

echo "Initial: ".memory_get_usage()." bytes /n"; <BR>/* 输出 <BR>Initial: 361400 bytes <BR>*/<br><br>// 使用内存 <BR>for ($i = 0; $i < 100000; $i++) { <BR>    $array []= md5($i); <BR>} <br><br>// 删除一半的内存 <BR>for ($i = 0; $i < 100000; $i++) { <BR>    unset($array[$i]); <BR>} <br><br>echo "Final: ".memory_get_usage()." bytes /n"; <BR>/* prints <BR>Final: 885912 bytes <BR>*/<br><br>echo "Peak: ".memory_get_peak_usage()." bytes /n"; <BR>/* 输出峰值 <BR>Peak: 13687072 bytes <BR>*/<BR>


4. CPU使用信息
使用getrusage() 函数可以让你知道CPU的使用情况。注意,这个功能在Windows下不可用。

print_r(getrusage()); <BR>/* 输出 <BR>Array <BR>( <BR>    [ru_oublock] => 0 <BR>    [ru_inblock] => 0 <BR>    [ru_msgsnd] => 2 <BR>    [ru_msgrcv] => 3 <BR>    [ru_maxrss] => 12692 <BR>    [ru_ixrss] => 764 <BR>    [ru_idrss] => 3864 <BR>    [ru_minflt] => 94 <BR>    [ru_majflt] => 0 <BR>    [ru_nsignals] => 1 <BR>    [ru_nvcsw] => 67 <BR>    [ru_nivcsw] => 4 <BR>    [ru_nswap] => 0 <BR>    [ru_utime.tv_usec] => 0 <BR>    [ru_utime.tv_sec] => 0 <BR>    [ru_stime.tv_usec] => 6269 <BR>    [ru_stime.tv_sec] => 0 <BR>) <br><br>*/<BR>


这个结构上看很晦涩,除非你对CPU很了解。下面一些解释:
ru_oublock: 块输出操作
ru_inblock: 块输入操作
ru_msgsnd: 发送的message
ru_msgrcv: 收到的message
ru_maxrss: 最大驻留集大小
ru_ixrss: 全部共享内存大小
ru_idrss:全部非共享内存大小
ru_minflt: 页回收
ru_majflt: 页失效
ru_nsignals: 收到的信号
ru_nvcsw: 主动上下文切换
ru_nivcsw: 被动上下文切换
ru_nswap: 交换区
ru_utime.tv_usec: 用户态时间 (microseconds)
ru_utime.tv_sec: 用户态时间(seconds)
ru_stime.tv_usec: 系统内核时间 (microseconds)
ru_stime.tv_sec: 系统内核时间?(seconds)

要看到你的脚本消耗了多少CPU,我们需要看看“用户态的时间”和“系统内核时间”的值。秒和微秒部分是分别提供的,您可以把微秒值除以100万,并把它添加到秒的值后,可以得到有小数部分的秒数。

// sleep for 3 seconds (non-busy) <BR>sleep(3); <br><br>$data = getrusage(); <BR>echo "User time: ". <BR>    ($data['ru_utime.tv_sec'] + <BR>    $data['ru_utime.tv_usec'] / 1000000); <BR>echo "System time: ". <BR>    ($data['ru_stime.tv_sec'] + <BR>    $data['ru_stime.tv_usec'] / 1000000); <br><br>/* 输出 <BR>User time: 0.011552 <BR>System time: 0 <BR>*/<BR>


sleep是不占用系统时间的,我们可以来看下面的一个例子:

// loop 10 million times (busy) <BR>for($i=0;$i<10000000;$i++) { <br><br>} <br><br>$data = getrusage(); <BR>echo "User time: ". <BR>    ($data['ru_utime.tv_sec'] + <BR>    $data['ru_utime.tv_usec'] / 1000000); <BR>echo "System time: ". <BR>    ($data['ru_stime.tv_sec'] + <BR>    $data['ru_stime.tv_usec'] / 1000000); <br><br>/* 输出 <BR>User time: 1.424592 <BR>System time: 0.004204 <BR>*/<BR>


这花了大约14秒的CPU时间,几乎所有的都是用户的时间,因为没有系统调用。
系统时间是CPU花费在系统调用上的上执行内核指令的时间。下面是一个例子:

$start = microtime(true); <BR>// keep calling microtime for about 3 seconds <BR>while(microtime(true) - $start < 3) { <br><br>} <br><br>$data = getrusage(); <BR>echo "User time: ". <BR>    ($data['ru_utime.tv_sec'] + <BR>    $data['ru_utime.tv_usec'] / 1000000); <BR>echo "System time: ". <BR>    ($data['ru_stime.tv_sec'] + <BR>    $data['ru_stime.tv_usec'] / 1000000); <br><br>/* prints <BR>User time: 1.088171 <BR>System time: 1.675315 <BR>*/<BR>


我们可以看到上面这个例子更耗CPU。

5. 系统常量
PHP 提供非常有用的系统常量 可以让你得到当前的行号 (__LINE__),文件 (__FILE__),目录 (__DIR__),函数名 (__FUNCTION__),类名(__CLASS__),方法名(__METHOD__) 和名字空间 (__NAMESPACE__),很像C语言。

我们可以以为这些东西主要是用于调试,当也不一定,比如我们可以在include其它文件的时候使用?__FILE__ (当然,你也可以在 PHP 5.3以后使用 __DIR__ ),下面是一个例子。

// this is relative to the loaded script's path <BR>// it may cause problems when running scripts from different directories <BR>require_once('config/database.php'); <br><br>// this is always relative to this file's path <BR>// no matter where it was included from <BR>require_once(dirname(__FILE__) . '/config/database.php');<BR>


下面是使用 __LINE__ 来输出一些debug的信息,这样有助于你调试程序:

// some code <BR>// ... <BR>my_debug("some debug message", __LINE__); <BR>/* 输出 <BR>Line 4: some debug message <BR>*/<br><br>// some more code <BR>// ... <BR>my_debug("another debug message", __LINE__); <BR>/* 输出 <BR>Line 11: another debug message <BR>*/<br><br>function my_debug($msg, $line) { <BR>    echo "Line $line: $msg/n"; <BR>}<BR>


6.生成唯一的ID
有很多人使用 md5() 来生成一个唯一的ID,如下所示:
// generate unique string
echo md5(time() . mt_rand(1,1000000));
其实,PHP中有一个叫uniqid() 的函数是专门用来干这个的:

// generate unique string <BR>echo uniqid(); <BR>/* 输出 <BR>4bd67c947233e <BR>*/<br><br>// generate another unique string <BR>echo uniqid(); <BR>/* 输出 <BR>4bd67c9472340 <BR>*/<BR>


可能你会注意到生成出来的ID前几位是一样的,这是因为生成器依赖于系统的时间,这其实是一个非常不错的功能,因为你是很容易为你的这些ID排序的。这点MD5是做不到的。
你还可以加上前缀避免重名:

// 前缀 <BR>echo uniqid('foo_'); <BR>/* 输出 <BR>foo_4bd67d6cd8b8f <BR>*/<br><br>// 有更多的熵 <BR>echo uniqid('',true); <BR>/* 输出 <BR>4bd67d6cd8b926.12135106 <BR>*/<br><br>// 都有 <BR>echo uniqid('bar_',true); <BR>/* 输出 <BR>bar_4bd67da367b650.43684647 <BR>*/<BR>


而且,生成出来的ID会比MD5生成的要短,这会让你节省很多空间。

7. 序列化
你是否会把一个比较复杂的数据结构存到数据库或是文件中?你并不需要自己去写自己的算法。PHP早已为你做好了,其提供了两个函数:serialize() 和 unserialize():

// 一个复杂的数组 <BR>$myvar = array( <BR>    'hello', <BR>    42, <BR>    array(1,'two'), <BR>    'apple'<BR>); <br><br>// 序列化 <BR>$string = serialize($myvar); <br><br>echo $string; <BR>/* 输出 <BR>a: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";} <BR>*/<br><br>// 反序例化 <BR>$newvar = unserialize($string); <br><br>print_r($newvar); <BR>/* 输出 <BR>Array <BR>( <BR>    [0] => hello <BR>    [1] => 42 <BR>    [2] => Array <BR>        ( <BR>            [0] => 1 <BR>            [1] => two <BR>        ) <br><br>    [3] => apple <BR>) <BR>*/<BR>


这是PHP的原生函数,然而在今天JSON越来越流行,所以在PHP5.2以后,PHP开始支持JSON,你可以使用 json_encode() 和 json_decode() 函数

// a complex array <BR>$myvar = array( <BR>    'hello', <BR>    42, <BR>    array(1,'two'), <BR>    'apple'<BR>); <br><br>// convert to a string <BR>$string = json_encode($myvar); <br><br>echo $string; <BR>/* prints <BR>["hello",42,[1,"two"],"apple"] <BR>*/<br><br>// you can reproduce the original variable <BR>$newvar = json_decode($string); <br><br>print_r($newvar); <BR>/* prints <BR>Array <BR>( <BR>    [0] => hello <BR>    [1] => 42 <BR>    [2] => Array <BR>        ( <BR>            [0] => 1 <BR>            [1] => two <BR>        ) <br><br>    [3] => apple <BR>) <BR>*/<BR>


这看起来更为紧凑一些了,而且还兼容于Javascript和其它语言。但是对于一些非常复杂的数据结构,可能会造成数据丢失。

8. 字符串压缩
当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的。PHP提供了gzcompress() 和 gzuncompress() 函数:

$string = <BR>"Lorem ipsum dolor sit amet, consectetur <BR>adipiscing elit. Nunc ut elit id mi ultricies <BR>adipiscing. Nulla facilisi. Praesent pulvinar, <BR>sapien vel feugiat vestibulum, nulla dui pretium orci, <BR>non ultricies elit lacus quis ante. Lorem ipsum dolor <BR>sit amet, consectetur adipiscing elit. Aliquam <BR>pretium ullamcorper urna quis iaculis. Etiam ac massa <BR>sed turpis tempor luctus. Curabitur sed nibh eu elit <BR>mollis congue. Praesent ipsum diam, consectetur vitae <BR>ornare a, aliquam a nunc. In id magna pellentesque <BR>tellus posuere adipiscing. Sed non mi metus, at lacinia <BR>augue. Sed magna nisi, ornare in mollis in, mollis <BR>sed nunc. Etiam at justo in leo congue mollis. <BR>Nullam in neque eget metus hendrerit scelerisque <BR>eu non enim. Ut malesuada lacus eu nulla bibendum <BR>id euismod urna sodales. "; <br><br>$compressed = gzcompress($string); <br><br>echo "Original size: ". strlen($string)."/n"; <BR>/* 输出原始大小 <BR>Original size: 800 <BR>*/<br><br>echo "Compressed size: ". strlen($compressed)."/n"; <BR>/* 输出压缩后的大小 <BR>Compressed size: 418 <BR>*/<br><br>// 解压缩 <BR>$original = gzuncompress($compressed);<BR>


几乎有50% 压缩比率。同时,你还可以使用gzencode() 和 gzdecode() 函数来压缩,只不用其用了不同的压缩算法。

9. 注册停止函数
有一个函数叫做register_shutdown_function(),可以让你在整个脚本停时前运行代码。让我们看下面的一个示例:

// capture the start time <BR>$start_time = microtime(true); <br><br>// do some stuff <BR>// ... <br><br>// display how long the script took <BR>echo "execution took: ". <BR>        (microtime(true) - $start_time). <BR>        " seconds.";<BR>


上面这个示例只不过是用来计算某个函数运行的时间。然后,如果你在函数中间调用exit() 函数,那么你的最后的代码将不会被运行到。并且,如果该脚本在浏览器终止(用户按停止按钮),其也无法被运行。
而当我们使用了register_shutdown_function()后,你的程序就算是在脚本被停止后也会被运行:

$start_time = microtime(true); <br><br>register_shutdown_function('my_shutdown'); <br><br>// do some stuff <BR>// ... <br><br>function my_shutdown() { <BR>    global $start_time; <br><br>    echo "execution took: ". <BR>            (microtime(true) - $start_time). <BR>            " seconds."; <BR>}<BR>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:九个你必须知道而且又很好用的php函数和特点_php技巧

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址