PHP闭包函数(closures)
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数 callable参数的值。
闭包的概念等同于JS里的闭包。可在函数内进行定义赋值
匿名函数目前是通过 Closure 类来实现的。闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:
闭包可以从父作用域中继承变量。 任何此类变量都应该用 use
语言结构传递进去。 PHP 7.1 起,不能传入此类变量: superglobals、 $this 或者和参数重名。
匿名函数允许被定义为静态化(使用static修饰)。这样可以防止当前类自动绑定到它们身上,对象在运行时也可能不会被绑定到它们上面。
匿名类
PHP 7 支持通过 new class 来实例化一个匿名类,这可以用来替代一些"用后即焚"的完整类定义。
可变参数
PHP 在用户自定义函数中支持可变数量的参数列表。由 ... 语法实现。
注意: 还可以使用以下函数来获取可变参数 func_num_args()、 func_get_arg() 和 func_get_args(),不建议使用此方式,请使用 ... 来替代。
包含 ... 的参数,会转换为指定参数变量的一个数组,见以下示例
代码语言:javascript复制<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc = $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
可以使用 ... 语法来传递 array 或 Traversable 做为参数到函数中:
<?php
function add($a, $b) {
return $a $b;
}
echo add(...[1, 2])."n";
$a = [1, 2];
echo add(...$a);
?>
循环内可以include。
计算时间差
代码语言:javascript复制$time= date("Y-m-d H:i:s",time()-600000);
$time=date_diff(date_create($time),date_create(date("Y-m-d H:i:s",time())));
直接返回DateInterval对象,保存两个时间相差的年月日时分秒;
注册一个会在php中止时执行的函数
代码语言:javascript复制register_shutdown_function(callable $callback, mixed $parameter = ?, mixed $... = ?): void
注册一个 callback
,它会在脚本执行完成或者 exit() 后被调用。
可以多次调用 register_shutdown_function() ,这些被注册的回调会按照他们注册时的顺序被依次调用。 如果你在注册的方法内部调用 exit(), 那么所有处理会被中止,并且其他注册的中止回调也不会再被调用。
PHP7.4新特性
serialize和unserialize,PHP对象序列反序列化;
箭头函数,箭头函数的基本语法为 fn (argument_list) => expr
。
合并运算符 “??”;
连接闭包和外界变量的关键字:USE,闭包可以保存所在代码块上下文的一些变量和值。PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字。
代码语言:javascript复制<?php
$var=1;
$recursive = function () use ($var) {
}
?>
命令行下的PHP
在php命令行下执行.php文件时,执行环境的工作目录是php命令程序(php.exe)所在目录,所以如果想在文件内使用相对路径时,要先切换当前的工作目录才行。 解决方法:将工作目录切换到当前文件目录
代码语言:javascript复制$cur_dir = dirname(__FILE__);
chdir($cur_dir);
require('../class/info.php');
pathinfo()
pathinfo() 函数以数组的形式返回关于文件路径的信息。
返回的数组元素如下:
- [dirname]: 目录路径
- [basename]: 文件名
- [extension]: 文件后缀名
- [filename]: 不包含后缀的文件名
system和exce函数的区别
注意:如果程序使用这两种函数启动,为了能保持在后台运行,此程序必须将输出重定向到文件或其它输出流。否则会导致 PHP 挂起,直至程序执行结束。
1.exec ---执行外部程序
代码语言:javascript复制string exec ( string $command [, array &$output [, int &$return_var ]] )
$command ,要执行的shell 命令
$output, shell命令的输出填充此数组,每行输出填充数组中的一个元素。 请注意,如果数组中已经包含了部分元素,exec() 函数会在数组末尾追加内容。如果你不想在数组末尾进行追加,请在传入 exec() 函数之前 对数组使用 unset() 函数进行重置。
$return_var,命令执行后的返回状态,命令执行成功值是0
返回值, shell命令输出的最后一行
注意:在 Windows 下,exec() 函数会先启动 cmd.exe 来执行指定的命令。如果你希望启动一个额外的应用而不用先启动 cmd.exe 可使用 proc_open() 函数加上bypass_shell
参数。
2.system — 执行外部程序,并且显示输出
不同于exec,system会直接输出命令执行的结果。
代码语言:javascript复制system(string $command, int &$return_var = ?): string
command,要执行的命令。
return_var,如果提供 return_var 参数, 则外部命令执行后的返回状态将会被设置到此变量中。
返回值,成功则返回命令输出的最后一行, 失败则返回 false
类型的还有:popen()、proc_open()、等等;
PHP程序执行:https://www.php.net/manual/zh/book.exec.php
如果你的程序需要在windows后台运行,并且是在cmd下启动,那么在执行的程序前加上start /b,比如start /b [程序名]。
3.popen()
代码语言:javascript复制popen(string $command, string $mode): resource
返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets(),fgetss() 和 fwrite()。 当模式为 'r',返回的文件指针等于命令的 STDOUT,当模式为 'w',返回的文件指针等于命令的 STDIN。
官方文档:https://www.php.net/manual/zh/function.popen.php
4.proc_open
代码语言:javascript复制proc_open(
mixed $cmd,
array $descriptorspec,
array &$pipes,
string $cwd = null,
array $env = null,
array $other_options = null
): resource
类似 popen() 函数, 但是 proc_open() 提供了更加强大的控制程序执行的能力。
YAML
YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。
YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
YAML 的配置文件后缀为 .yml,如:runoob.yml 。
PHP用于读取yaml的函数:https://www.php.net/manual/zh/function.yaml-parse-file.php
PHP COM对象操作
首先在php.ini中加入,extension=php_com_dotnet.dll
然后在php.ini中开启,com.allow_dcom = true
之后就可以使用new COM进行操作了。
PHP反引号运算符
PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。
代码语言:javascript复制<?php
$output = `ls -al`;
echo "<pre>$output</pre>";
?>
PHP没怎么见过的加解密函数
bin2hex 、hex2bin(),用于字符串转16进制以及转回来。
代码语言:javascript复制<?php
echo bin2hex("我在中国!");
echo "n".hex2bin("e68891e4b99fe4b88de79fa5e98193");
字符编码检测
代码语言:javascript复制$out_string = mb_detect_encoding("不知道", array("ASCII", "UTF-8", "GB2312", "GBK", "BIG5"));
wordwrap(),函数
wordwrap(string,width,break,cut),函数按照指定长度对字符串进行折行处理。
注释:该函数可能会在行的开头留下空格。
list函数
list() 函数用数组中的元素为一组变量赋值。注意,与 array() 类似,list() 实际上是一种语言结构,不是函数。
extract() 函数
extract() 函数从数组中将变量导入到当前的符号表。
代码语言:javascript复制<?php
$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "$a = $a; $b = $b; $c = $c";
?>
各种print函数的区别
1.printf
printf用于输出格式化的字符串(输出到屏幕、或者fpm);
代码语言:javascript复制<?php
$number = 9;
$str = "Beijing";
printf("There are %u million bicycles in %s.",$number,$str);
?>
2.sprintf
用于格式化字符串,但是不输出
3.fprintf
fprintf() 函数把格式化的字符串写入到指定的输出流
提示
函数前面带v,代表作为格式化输出的变量是数组的元素
进制互转
hexdec、hex2bin
获取格林威治时间
代码语言:javascript复制gmdate("M d Y H:i:s",time() 8*3600);
gmdate('D, d M Y H:i:s GMT', time() 8 * 3600);
文件匹配
代码语言:javascript复制$file_search = glob( $upload_root . '/' . $url_md5 . '.*' );
AES加解密
代码语言:javascript复制openssl_decrypt($data,'AES-128-ECB',$key, OPENSSL_RAW_DATA);
base64_encode(openssl_encrypt($originTxt, 'AES-128-ECB',$key, OPENSSL_RAW_DATA));