|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习了六个多月PHP了,还是个新手,在这里受到了很多人的帮助,谢谢你们! </p> 即便利用 PHP 多年,也会偶尔发明一些不曾懂得的函数和功效。个中有些长短常有效的,但没有失掉充实使用。并非一切人城市从头至尾一页一页地浏览手册和函数参考!
1、恣意参数数量的函数
你能够已晓得,PHP 答应界说可选参数的函数。但也有完整答应恣意数量的函数参数的办法。以下是可选参数的例子:
- // function with 2 optional arguments function foo($arg1 = '', $arg2 = '') { echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; } foo('hello','world'); /* prints: arg1: hello arg2: world */ foo(); /* prints: arg1: arg2: */
复制代码 如今让咱们看看若何创立可以承受任何参数数量的函数。这一次需求利用 func_get_args() 函数:
- // yes, the argument list can be empty function 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'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: 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"; /* prints Initial: 361400 bytes */ // let's use up some memory for ($i = 0; $i < 100000; $i++) { $array []= md5($i); } // let's remove half of the array for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes \n"; /* prints Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* prints Peak: 13687072 bytes */
复制代码 4、CPU 利用信息
为此,咱们要使用 getrusage() 函数。请记住这个函数不合用于 Windows 平台。
- print_r(getrusage()); /* prints Array ( [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 operations ru_inblock: block input operations ru_msgsnd: messages sent ru_msgrcv: messages received ru_maxrss: maximum resident set size ru_ixrss: integral shared memory size ru_idrss: integral unshared data size ru_minflt: page reclaims ru_majflt: page faults ru_nsignals: signals received ru_nvcsw: voluntary context switches ru_nivcsw: involuntary context switches ru_nswap: swaps ru_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); /* prints User time: 0.011552 System time: 0 */
复制代码 虽然剧本运转用了大约 3 秒钟,CPU 利用率却十分十分低。由于在睡眠运转的过程当中,该剧本实践上不用耗 CPU 资本。还有很多其他的义务,能够需求一段工夫,但不占用相似守候磁盘操作等 CPU 工夫。因而正如你所看到的,CPU 利用率和运转工夫的实践长度其实不老是不异的。上面是一个例子:
- // yes, the argument list can be empty function 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'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */ 0
复制代码 这花了大约 1.4 秒的 CPU 工夫,但几近都是用户工夫,由于没有体系挪用。体系工夫是指消费在履行法式的体系挪用时的 CPU 开支。上面是一个例子:
- // yes, the argument list can be empty function 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'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */ 1
复制代码 如今咱们有相当多的体系工夫占用。这是由于剧本屡次挪用 microtime() 函数,该函数需求向操作体系收回恳求,以获得所需工夫。你也能够会注重到运转工夫加起来不到 3 秒。这是由于有能够在办事器上同时存在其他历程,而且剧本没有 100% 利用 CPU 的全部 3 秒延续工夫。
5、魔术常量
PHP 供应了获得以后行号 (__LINE__)、文件途径 (__FILE__)、目次途径 (__DIR__)、函数名 (__FUNCTION__)、类名 (__CLASS__)、办法名 (__METHOD__) 和定名空间 (__NAMESPACE__) 等有效的魔术常量。在这篇文章中不作逐一引见,然而我将告知你一些用例。当包括其他剧本文件时,利用 __FILE__ 常量(或利用 PHP5.3 新具有的 __DIR__ 常量):
- // yes, the argument list can be empty function 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'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */ 2
复制代码 利用 __LINE__ 使得调试更加轻松。你可以跟踪到详细行号。
- // yes, the argument list can be empty function 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'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */ 3
复制代码 6、生成独一标识符
某些场景下,能够需求生成一个独一的字符串。我看到良多人利用 md5() 函数,即便它其实不完整意味着这个目标:
- // yes, the argument list can be empty function 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'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */ 4
复制代码 There is actually a PHP function named uniqid() that is meant to be used for this.
- // yes, the argument list can be empty function 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'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */ 5
复制代码 你能够会注重到,虽然字符串是独一的,前几个字符倒是相似的,这是由于生成的字符串与办事器工夫相干。但实践上也存在友爱的一方面,因为每一个重生成的 ID 会按字母按次分列,如许排序就变得很复杂。为了削减反复的几率,你可以传递一个前缀,或第二个参数来增添熵:
- // yes, the argument list can be empty function 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'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */ 6
复制代码 这个函数将发生比 md5() 更短的字符串,能节俭一些空间。
7、序列化
你有无碰到过需求在数据库或文本文件存储一个庞杂变量的情形?你能够没能想出一个格局化字符串并转换成数组或对象的好办法,PHP 已为你筹办好此功效。有两种序列化变量的盛行办法。上面是一个例子,利用 serialize() 和 unserialize() 函数:
- // yes, the argument list can be empty function 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'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */ 7
复制代码 这是原生的 PHP 序列化办法。但是,因为 JSON 最近几年来大受接待,PHP5.2 中已到场了对 JSON 格局的撑持。如今你可使用 json_encode() 和 json_decode() 函数:
- // yes, the argument list can be empty function 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'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */ 8
复制代码 这将更加卓有成效,特别与 JavaScript 等很多其他言语兼容。但是关于庞杂的对象,某些信息能够会丧失。
8、紧缩字符串
在谈到紧缩时,咱们凡是想到文件紧缩,如 ZIP 紧缩等。在 PHP 中字符串紧缩也是能够的,但不触及任何紧缩文件。鄙人面的例子中,咱们要使用 gzcompress() 和 gzuncompress() 函数:
- // yes, the argument list can be empty function 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'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */ 9
复制代码 这类操作的紧缩率能到达 50% 摆布。别的的函数 gzencode() 和 gzdecode() 能到达相似了局,经由过程利用分歧的紧缩算法。
9、注册中断功效
有一个函数叫做 register_shutdown_function(),可让你在某段剧本完成运转之前,履行一些指定代码。假定你需求在剧本履行停止前捕捉一些基准统计信息,例如运转的工夫长度:
- // 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 ) */ 0
复制代码 这仿佛微乎其微,你只需求在剧本运转的最初添加相干代码。然而假如你挪用过 exit() 函数,该代码将没法运转。另外,假如有一个致命的毛病,或剧本被用户不测终止,它能够没法再次运转。当你利用 register_shutdown_function() 函数,代码将持续履行,不管剧本是不是中断运转:
- // 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 ) */ 1
复制代码 英文原稿:9 Useful PHP Functions and Features You Need to Know Nettuts
不断巩固,摸透大部分PHP常用函数,并可理解OOP,MYSQL优化,以及模板 |
|