热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

8个PHP程序员常用的功能汇总

这篇文章主要介绍了8个PHP程序员常用的功能汇总,需要的朋友可以参考下

  做过PHP开发的程序员应该清楚,PHP中有很多内置的功能,掌握了它们,可以帮助你在做PHP开发时更加得心应手,本文将分享8个开发必备的PHP功能,个个都非常实用,希望各位PHP开发者能够掌握。

  1、传递任意数量的函数参数

  我们在.NET或者JAVA编程中,一般函数参数个数都是固定的,但是PHP允许你使用任意个数的参数。下面这个示例向你展示了PHP函数的默认参数:

代码如下:

// 两个默认参数的函数
function foo($arg1 = ”, $arg2 = ”) {
echo “arg1: $arg1\n”;
echo “arg2: $arg2\n”;
}
foo(‘hello','world');
 /* 输出:
arg1: hello
 arg2: world
 */
foo();
 /* 输出:
arg1:
 arg2:
 */

  下面这个示例是PHP的不定参数用法,其使用到了?func_get_args()方法:

代码如下:

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

  2、使用glob()查找文件

  大部分PHP函数的函数名从字面上都可以理解其用途,但是当你看到?glob() 的时候,你也许并不知道这是用来做什么的,其实glob()和scandir() 一样,可以用来查找文件,请看下面的用法:

代码如下:

// 取得所有的后缀为PHP的文件
$files = glob(‘*.php');
 
print_r($files);
 /* 输出:
Array
 (
 [0] => phptest.php
 [1] => pi.php
 [2] => post_output.php
 [3] => test.php
 )
 */

  你还可以查找多种后缀名

代码如下:

// 取PHP文件和TXT文件
$files = glob(‘*.{php,txt}', GLOB_BRACE);
 
print_r($files);
 /* 输出:
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);
 /* 输出:
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的内存回收机制已经非常强大,你也可以使用PHP脚本获取当前内存的使用情况,调用memory_get_usage() 函数获取当期内存使用情况,调用memory_get_peak_usage() 函数获取内存使用的峰值。参考代码如下:

代码如下:

echo “Initial: “.memory_get_usage().” bytes \n”;
 /* 输出
Initial: 361400 bytes
 */
// 使用内存
for ($i = 0; $i <100000; $i++) {
 $array []= md5($i);
 }
// 删除一半的内存
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”;
 /* 输出峰值
Peak: 13687072 bytes
 */

  4、获取CPU使用情况信息

  获取了内存使用情况,也可以使用PHP的getrusage()获取CPU使用情况,该方法在windows下不可用。

代码如下:

print_r(getrusage());
 /* 输出
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
 )
*/

  这个结构看上出很晦涩,除非你对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: 系统内核时间&#63;(seconds)
  要看到你的脚本消耗了多少CPU,我们需要看看“用户态的时间”和“系统内核时间”的值。秒和微秒部分是分别提供的,您可以把微秒值除以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);
/* 输出
User time: 0.011552
 System time: 0
 */

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

代码如下:

// 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);
/* 输出
User time: 1.424592
 System time: 0.004204
 */

  这花了大约14秒的CPU时间,几乎所有的都是用户的时间,因为没有系统调用。

  系统时间是CPU花费在系统调用上的上执行内核指令的时间。下面是一个例子:

代码如下:

$start = microtime(true);
 // keep calling microtime for about 3 seconds
 while(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);
/* prints
 User time: 1.088171
 System time: 1.675315
 */

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

  5、获取系统常量

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

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

代码如下:

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

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

代码如下:

// some code
 // …
my_debug(“some debug message”, __LINE__);
 /* 输出
Line 4: some debug message
 */
// some more code
 // …
my_debug(“another debug message”, __LINE__);
 /* 输出
Line 11: another debug message
 */
function my_debug($msg, $line) {
 echo “Line $line: $msg\n”;
 }

  6、生成唯一的id

  很多朋友都利用md5()来生成唯一的编号,但是md5()有几个缺点:1、无序,导致数据库中排序性能下降。2、太长,需要更多的存储空间。其实PHP中自带一个函数来生成唯一的id,这个函数就是uniqid()。下面是用法:

代码如下:

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

  该算法是根据CPU时间戳来生成的,所以在相近的时间段内,id前几位是一样的,这也方便id的排序,如果你想更好的避免重复,可以在id前加上前缀,如:

代码如下:

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

  7、序列化

  PHP序列化功能大家可能用的比较多,也比较常见,当你需要把数据存到数据库或者文件中是,你可以利用PHP中的serialize() 和 unserialize()方法来实现序列化和反序列化,代码如下:

代码如下:

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

  如何序列化成json格式呢,放心,php也已经为你做好了,使用php 5.2以上版本的用户可以使用json_encode() 和 json_decode() 函数来实现json格式的序列化,代码如下:

代码如下:

// 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);
 /* prints
 Array
 (
 [0] => hello
 [1] => 42
 [2] => Array
 (
 [0] => 1
 [1] => two
 )
[3] => apple
 )
 */

  8、字符串压缩

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

代码如下:

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

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

  以上就是8个PHP程序员必须掌握的功能,是不是都很实用呢?


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
author-avatar
刘刘刘刘刘志锋_506
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有