编程日记:PHP实用函数记录(二)

2023-02-17 13:46:57 浏览数 (1)

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));

0 人点赞