PHP中的一些杂项函数学习
今天来学习的这些杂项函数在官方文档中都是放在一个杂项扩展中的,其实这些函数都并不是什么什么特别的扩展,也不需要安装什么东西就可以使用,它们就是一些简单的功能函数而已。当然,其中不少内容也是我们经常会使用的,这里就带大家一起再学习学习。
常量操作
常量的操作相信对于我们日常使用 PHP 开发的小伙伴来说绝对不会陌生。不管是使用框架还是自己写代码,经常会使用到常量相关的内容。
define("A", "Test A");
var_dump(A); // string(6) "Test A"
var_dump(B); // Warning: Use of undefined constant B - assumed 'B'
var_dump(constant('A')); // string(6) "Test A"
var_dump(constant('B')); // NULL
// PHP Warning: Use of undefined constant B - assumed 'B'
var_dump(defined('A')); // bool(true)
var_dump(defined('B')); // bool(false)
简单地定义常量就是使用 define() 这个函数,它有两个参数,第一个参数是常量的名称,第二个参数就是常量的值。这里需要注意的是,常量的值只能是标量类型,也就是数字、字符串这类的内容,不能是变量或者对象类型,因为这类型的内容都有随时改变的可能。
直接使用常量名就可以打印出常量的内容,当然,我们也可以使用 constant() 这个函数来获取常量的内容,它可以接收字符串类型的参数的常量名。
defined() 这个函数是用于判断指定的常量是否存在,它只比 define() 函数多了一个字母 d ,在使用的时候要小心,不要在定义常量的时候多写了这个 d 哦。
对于接口和类来说,也可以在它们的内部使用 const 关键字来定义内部常量。
interface A1{
const TEST = 'Test A1';
}
class A2{
const TEST = 'Test A2';
}
var_dump(constant('A1::TEST')); // string(7) "Test A1"
var_dump(constant('A2::TEST')); // string(7) "Test A2"
var_dump(defined('A1::TEST')); // bool(true)
var_dump(defined('A2::TEST')); // bool(true)
内部常量是有作用域范围的,它们只在类的内部生效。而且在默认情况下,这些常量直接就是静态类型的,不需要我们再单独添加 static 关键字。
代码高亮及文件格式相关
我们可以使用一个函数,来让代码实现高亮的效果。其实也就是给指定的代码内容增加了 code 以及一些格式标签。
var_dump(highlight_string('<?php phpinfo(); ?>', true));
// string(195) "<code><span style="color: #000000">
// <span style="color: #0000BB"><?php phpinfo</span><span style="color: #007700">(); </span><span style="color: #0000BB">?></span>
// </span>
// </code>"
highlight_string() 的第二个参数是指定返回的类型,如果我们不给这个参数的话,它的默认值是 false ,这样调用 highlight_string() 时就会直接输出而不是将内容作为返回值返回。也就是说,像 phpinfo() 这类函数一样,它会直接将结果打印出来。
另外,我们也可以直接对一个文件里面的内容进行高亮操作。
var_dump(highlight_file('1.PHP中的一些杂项函数学习.php', true));
// string(10610) "<code><span style="color: #000000">
// <span style="color: #0000BB"><?php<br /><br /><br />define</span><span style="color: #007700">(</span><span style="color: #DD0000">"A"</span><span style="color: #007700">, </span><span style="color: #DD0000">"Test A"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">A</span><span style="color: #007700">); </span><span style="color: #FF8000">// string(6) "Test A"<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">B</span><span style=" ……………………………………
var_dump(show_source('1.PHP中的一些杂项函数学习.php', true));
// string(10610) "<code><span style="color: #000000">
// <span style="color: #0000BB"><?php<br /><br /><br />define</span><span style="color: #007700">(</span><span style="color: #DD0000">"A"</span><span style="color: #007700">, </span><span style="color: #DD0000">"Test A"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">A</span><span style="color: #007700">); </span><span style="color: #FF8000">// string(6) "Test A"<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">B</span><span style=" ……………………………………
highlight_file() 函数的第一个参数需要的是一个文件的路径,而第二个参数的作用就和 highlight_string() 中的第二个参数的作用是一样的。另外,highlight_file() 还有一个别名函数叫做 show_source() 。
除了代码高亮的功能之外,还有一个函数 php_strip_whitespace() 可以帮助我们直接去掉代码中的空格和换行以及注释内容。就像压缩代码之类的工具一样。
var_dump(php_strip_whitespace("1.PHP中的一些杂项函数学习.php"));
// string(570) "<?php
// define("A", "Test A"); var_dump(A); var_dump(B); var_dump(constant('A')); var_dump(constant('B')); var_dump(defined('A')); var_dump(defined('B')); interface A1{ const TEST = 'Test A1'; } class A2{ const TEST = 'Test A2'; } var_dump(constant('A1::TEST')); var_dump(constant('A2::TEST')); var_dump(defined('A1::TEST')); …………………………
时间操作函数
在杂项函数中,也有一些时间相关的操作函数,比如系统运行的时间。
echo hrtime(true), PHP_EOL; // 2636292334692
print_r(hrtime());
// Array
// (
// [0] => 2636
// [1] => 292338001
// )
在之前的文章中我们其实有讲过这个 hrtime() 函数的作用。它返回的是当前操作系统开机到现在经过的时间,比如我的电脑是早上开机的,从开机到现在只经过了 2636 秒。它返回的是纳秒级别的,如果不加那个布尔类型为 true 的参数的话,它就会以数组的形式返回,0 下标的是秒数,1 下标的是纳秒数。而如果加了 true 参数的话,它就会直接以数字格式返回整体的秒加上纳秒数。
另外一些时间相关的函数就是暂停程序执行的一些函数,比如我们经常会用到的 sleep() 函数。
$time = microtime(true);
echo $time, PHP_EOL; // 1609723496.283
sleep(1);
echo microtime(true) - $time, PHP_EOL; // 1.0041399002075
usleep(2000);
echo microtime(true) - $time, PHP_EOL; // 1.0062718391418
time_nanosleep(2, 100000);
echo microtime(true) - $time, PHP_EOL; // 3.0067868232727
time_sleep_until(time()+3);
echo microtime(true) - $time, PHP_EOL; // 5.7171077728271
sleep() 是以秒为间隔暂停程序的执行。而其它的两个函数 usleep() 则是以微秒, time_nanosleep() 是以纳秒来进行暂停的。最后一个 time_sleep_until() 所需要的参数则是暂停到指定的时间,比如这里我们指定在三秒后暂停,它需要的参数就是 time() + 3 这个时间戳。当然,我们在日常开发中最常用的还是 sleep() 和 usleep() 。这里大家可以当做扩充一下知识点,我们 PHP 是可以实现纳秒级的暂停的。
生成唯一ID
生成唯一ID这个函数相信不少同学也经常使用,就是那个 uniqid() 函数。不过它的原理和参数你了解嘛?
var_dump(uniqid()); // string(13) "5ff270b0014b4"
var_dump(uniqid('pre_')); // string(17) "pre_5ff270b0014d7"
var_dump(uniqid('pre_', true)); // string(27) "pre_5ff270b0014df3.11521937"
uniqid() 是基于当前时间微秒数来生成唯一ID的,也就说它并不能完全地保证生成的这个 ID 是唯一的。在超大并发的前提下,很有可能在一微秒内就有多个请求到达,所以也是有可能生成多个重复的 ID 的。
在这种情况,我们可以通过它的参数来让生成的 ID 更具有的唯一性。第一个参数是可以指定生成 ID 的前缀,对于不同的业务或者不同的负载均衡之后的处理机器我们就可以使用不同的前缀来进行区分。第二个参数则是在返回的字符串结尾增加额外的熵,它可以进一步提升唯一性的可能性。
其它函数
除了上面介绍的那些比较常见和常用的函数外,杂项函数中还包含其它一些不是那么常用的内容。
系统负载
我们可以通过一个函数 sys_getloadavg() 来查看当前操作系统的负载情况,返回的结果数组对应的就是 Linux 系统中的 1m 、5m 和 15m 的负载情况。
var_dump(sys_getloadavg());
// array(3) {
// [0]=>
// float(2.98828125)
// [1]=>
// float(2.4775390625)
// [2]=>
// float(2.341796875)
// }
执行代码
eval() 这个函数和 JavaScript 中的 eval() 不管名称还是作用都是一样的,可以解析并运行一个字符串中的 PHP 代码。不过需要注意的是,它也是属于危险函数哦。要运行的字符串一定是我们自己可控的内容,千万不要运行用户能够上传的内容哦。
eval("echo '123', PHP_EOL;"); // 123
退出中断程序
exit;
die;
exit(0);
exit("End"); // End
exit() 和 die() 不用过多介绍了,它们两个的作用是一样的,可以将 die() 看成是 exit() 的别名。如果在没有参数的情况下,可以省略不写后面的括号。而参数的作用是在中断程序运行后进行输出。如果参数是字符串,则直接输出字符串的内容,如果参数是数字,则相当于是返回程序的运行状态码,和 Linux 中的状态码是一样的概念。
浏览器信息
当我们使用浏览器访问的时候,可以通过 get_browser() 函数来获得浏览器的一些信息。
var_dump(get_browser(null, true));
// array(15) {
// ["browser_name_regex"]=>
// string(108) "~^mozilla/5\.0 \(.*mac os x 10.15.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*version/14\.0.* safari/.*$~"
// ["browser_name_pattern"]=>
// string(88) "Mozilla/5.0 (*Mac OS X 10?15*) applewebkit* (*khtml*like*gecko*) *Version/14.0* Safari/*"
// ["parent"]=>
// string(11) "Safari 14.0"
// ["platform"]=>
// string(5) "macOS"
// ["comment"]=>
// string(11) "Safari 14.0"
// ["browser"]=>
// string(6) "Safari"
// ["browser_maker"]=>
// string(9) "Apple Inc"
// ["version"]=>
// string(4) "14.0"
// ["majorver"]=>
// string(2) "14"
// ["device_type"]=>
// string(7) "Desktop"
// ["device_pointing_method"]=>
// string(5) "mouse"
// ["minorver"]=>
// string(1) "0"
// ["ismobiledevice"]=>
// string(0) ""
// ["istablet"]=>
// string(0) ""
// ["crawler"]=>
// string(0) ""
// }
需要注意的是,这个函数需要一个 browscap.ini 文件的支持,可以从 http://browscap.org 这里下载到 browscap.ini 文件,并在 php.ini 文件中指定 browscap 的路径到你下载的这个 browscap.ini 文件。这个函数非常少见,大家了解一下即可。
连接信息
最后就是关于 PHP 脚本的连接信息的查看,也就是脚本与客户端的连接信息的查看。
ignore_user_abort(true);
while(1){
echo " ";
if (connection_status()!=0){
ob_start();
var_dump(connection_aborted());
$v = ob_get_contents();
ob_end_flush();
file_put_contents("1.txt", date("Y-m-d H:i:s") . " Connection aborted! " . $v . PHP_EOL, FILE_APPEND);
exit;
}
}
// 1.txt
// 2021-01-04 08:56:22 Connection aborted! int(1)
ignore_user_abort() 函数用于设置客户端断开连接时是否中断脚本的执行,当我们访问这个测试页面后,马上在浏览器上关闭它,就会触发这个函数。
下面的无限循环代码是用于监控当前连接的状态,使用的是 connection_status() 这个函数,当它的值为 0 时,也就是 CONNECTION_NORMAL 这个状态是属于正常连接的状态,而当它不为 0 的时候,我们就记录到一个日志文件中。connection_aborted() 是判断连接是否中断的函数,这是一个直接输出流的函数,我们需要通过 输入输出流 来捕获它的内容。
最后,当浏览器关闭的时候,连接相关的内容就记录到了 1.txt 这个文件中。我们可以查看这个文件里面的信息。
总结
怎么样,今天的内容虽然是 PHP 文档中的杂项扩展,而且内容也确实很杂,但它们有不少内容确实是我们经常使用的。掌握好它们,扩宽自己的眼界,总有一天这些内容会为你带来福报,加油吧,打工人。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/01/source/1.PHP中的一些杂项函数学习.php
参考文档:
https://www.php.net/manual/zh/book.misc.php
===============
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料
知乎、B站、公众号、抖音、头条、CSDN、博客园、开源中国、segmentfault、简书、微博搜索【硬核项目经理】
B站ID:482780532
PHP中的一些杂项函数学习的更多相关文章
- JS中的运算符_函数学习
js中的运算符: 算数运算符: + - * / % ++ -- 逻辑运算符: & | ! && || < > <= ...
- contiki-main.c 中的process系列函数学习笔记 <contiki学习笔记之六>
说明:本文依然依赖于 contiki/platform/native/contiki-main.c 文件. ---------------------------------------------- ...
- Python3中的字符串函数学习总结
这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...
- Java中的回调函数学习
Java中的回调函数学习 博客分类: J2SE JavaJ# 一般来说分为以下几步: 声明回调函数的统一接口interface A,包含方法callback(); 在调用类caller内将该接口设置 ...
- Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)
版本: 2012-09-29 2013-04-23 更新有关accept()和ignore()函数的相关内容. 2013-12-02 增加有关accept()和ignore()函数的示例. 上一章我们 ...
- jquery中ajax中post方法(多学习:洞悉原理,触类旁通)(函数封装思想)
jquery中ajax中post方法(多学习:洞悉原理,触类旁通)(函数封装思想) 一.总结 1.多看学习视频:洞悉原理,触类旁通, 2.函数封装:$.post(URL,data,callback); ...
- 有关OpenCV1.0中GUI命令的几个函数学习总结
1.修改窗口背景色或者光标形状 在OpenCV1.0版本利用函数int cvNamedWindow( const char* name, int flags )初始化创建一个窗口后,窗口的背景色是灰色 ...
- 零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构
http://www.cnblogs.com/tanlon/p/3879081.html 在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构: (1) AVF ...
- [原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构
在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构: (1) AVFormatContext AVFormatContext是一个贯穿始终的数据结构,很多函 ...
随机推荐
- Linux系统CPU信息查询方法
lscpu cat /proc/cpuinfo对绝大多数Linux适用,lscpu更简练 cat /proc/cpuinfo 下面是一个实例: processor : 0 vendor_id : Ge ...
- Git 使用revert回滚已提交的commit
在git使用中如果提交错误的代码至远程服务器,可以使用git revert 命令回滚单次commit并且不影响其他commit. 回滚最新一次的提交记录: git revert HEAD 回滚前一次的 ...
- Windows莫名内存到百分之百,需要修改虚拟内存
借鉴别人的操作: https://blog.csdn.net/xjpdf10/article/details/82849112
- 9、二进制安装K8s之增加node
二进制安装K8s之增加node 1.复制文件,要部署几台就直接复制即可 #二进制文件 scp /data/k8s/bin/{kubelet,kube-proxy} root@192.168.100.1 ...
- leaflet 动态线渲染
可以采用leaflet插件 leaflet-ant-path ... <script src="js/leaflet-ant-path.js" type="text ...
- ES6扩展——函数扩展之默认参数
1.函数的默认参数 //函数的默认参数 function add(a, b = 999){ console.log(a,b); //1 999 } add(1); 2. 函数的形参可以设置默认值,默认 ...
- Ubuntu 16.04 + python3 源码 安装+使用labelImg最新版
安装 sudo apt-get update sudo apt-get upgrade sudo apt install python3-pip git clone https://github.co ...
- 【Python机器学习实战】决策树与集成学习(四)——集成学习(2)GBDT
本打算将GBDT和XGBoost放在一起,但由于涉及内容较多,且两个都是比较重要的算法,这里主要先看GBDT算法,XGBoost是GBDT算法的优化和变种,等熟悉GBDT后再去理解XGBoost就会容 ...
- Qt5创建模态和非模态对话框
1.模态对话框创建: 第一种方法: QDialog dialog(this); dialog.exec(); this为该对话框的父窗口. 第二种方法: QDialog *dialog = new Q ...
- Vue 2.0 与 Vue 3.0 响应式原理比较
Vue 2.0 的响应式是基于Object.defineProperty实现的 当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 prop ...