PHP备忘录

PHP的一些特性

官方说明:https://www.php.net/manual/zh/migration70.new-features.php

严格模式

php7.0+

declare(strict_types=1);
⚠️该声明指令必须放在文件的顶部。

批量使用 use

php7.0+

use app\models\{Area, Category};

NULL 合并操作符

$a ?? $b ?? $c; 从左往右第一个存在且不为 NULL 的操作数。如果都没有定义且不为 NULL,则返回 NULL

定义常量数组

php7.0+

方式一:

1
2
3
4
5
6
7
8
<?php
define('ANIMALS', [
'dog',
'cat',
'bird'
]);

echo ANIMALS[1]; // 输出 "cat"

方式二:

1
2
3
4
5
6
<?php
const ANIMALS = [
'dog',
'cat',
'bird'
];

太空船操作符

php7.0+

1
2
3
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

整数除法函数

php7.0+

1
var_dump(intdiv(10, 3)); // int(3)

支持多个异常处理

php5.5+

1
2
3
4
5
6
7
try {
//do something
} catch (Error | Exception | Throwable $e) {
var_dump('Error', $e->getMessage(), $e->getCode());
} finally { // Code within the finally block will always be executed after the try and catch blocks
echo "First finally.\n";
}

Bug

PHP Bug 官方主页 https://bugs.php.net/index.php

PHP 7.1 版本以上 json_encode 编码浮点数精度丢失问题

Bug 报告:https://bugs.php.net/bug.php?id=74221

Bug 复现

1
2
3
<?php
echo json_encode(1.2);
// output 1.1999999999999999555910790149937383830547332763671875

解决方案
调整 php.ini 文件中的serialize_precisionserialize_precision = -1

其它

获取毫秒级时间戳

round(microtime(true) * 1000)

浮点数中显示有效数字的位数由 php.ini 中的 precision 参数控制

因为热爱,所以执着。