php7 新特性

标量类型说明
declare(strict_types=1); 来区分强制模式(默认)和严格模式。
strict_types=1 是严格模式,strict_types=0是默认模式
严格模式示例

1
2
3
4
5
function a(int $a)
{
return $a;
}
print(a('1'));

输出结果为:

1
PHP Fatal error:  Uncaught TypeError: Argument 1 passed to a() must be of the type integer, string given, called in……

严格模式下,传入的$a的值必须为int型

返回类型声明
代码示例

1
2
3
4
5
6
7
8
9
10
<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
return $value;
}

print(returnIntValue(5));
?>

返回类型必须是整形,否则报错

NULL 合并运算符
??值是否存在且不为nll则返回。
示例

1
$site = $a ?? '$a不存在的时候返回的值';

a变量是否存在并且不为null,则site变量为a变量的值,否则为’$a不存在的时候返回的值’。

太空船运算符(组合比较符)

1
2
3
4
$a<=>$b
$a>$b 1
$a=$b 0
$a<$b -1

常量数组
使用 define 函数来定义数组

1
2
3
4
5
6
<?php
define('sites', [
'a',
'b',
'c'
]);

匿名类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
interface Logger {
public function log(string $msg);
}

class Application {
private $logger;

public function getLogger(): Logger {
return $this->logger;
}

public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}

$app = new Application;
// 使用 new class 创建匿名类
$app->setLogger(new class implements Logger {
public function log(string $msg) {
print($msg);
}
});

$app->getLogger()->log("我的第一条日志");
?>

输出:
我的第一条日志

Closure::call()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class A {
private $x = 1;
}

// PHP 7 之前版本定义闭包函数代码
$getXCB = function() {
return $this->x;
};

// 闭包函数绑定到类 A 上
$getX = $getXCB->bindTo(new A, 'A');

echo $getX();
print(PHP_EOL);

// PHP 7+ 代码
$getX = function() {
return $this->x;
};
echo $getX->call(new A);
?>

输出:
1
1

过滤 unserialize()
unserialize() 提供过滤的特性,可以防止非法数据进行代码注入,提供了更安全的反序列化数据。

CSPRNG
PHP 7 通过引入几个 CSPRNG 函数提供一种简单的机制来生成密码学上强壮的随机数。
random_bytes() - 加密生存被保护的伪随机字符串。
random_int() - 加密生存被保护的伪随机整数。

random_bytes()
语法格式
string random_bytes ( int $length )
参数
length - 随机字符串返回的字节数。
返回值
返回一个字符串,接受一个int型入参代表返回结果的字节数。

random_int()
语法格式
int random_int ( int $min , int $max )
参数
min - 返回的最小值,必须是大于或等于 PHP_INT_MIN 。
max - 返回的最大值,必须是小于或等于 PHP_INT_MAX 。
返回值
返回一个指定范围内的int型数字。

use
PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类
use some\namespace{ClassA, ClassB, ClassC as C};
use function some\namespace{fn_a, fn_b, fn_c};
use const some\namespace{ConstA, ConstB, ConstC};

错误处理
PHP 7 改变了大多数错误的报告方式。不同于 PHP 5 的传统错误报告机制,现在大多数错误被作为 Error 异常抛出。

这种 Error 异常可以像普通异常一样被 try / catch 块所捕获。如果没有匹配的 try / catch 块, 则调用异常处理函数(由 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。

Error 类并不是从 Exception 类 扩展出来的,所以用 catch (Exception $e) { … } 这样的代码是捕获不 到 Error 的。你可以用 catch (Error $e) { … } 这样的代码,或者通过注册异常处理函数( set_exception_handler())来捕获 Error。

intdiv() 函数
PHP 7 新增加了 intdiv() 函数,接收两个参数,返回值为第一个参数除于第二个参数的值并取整。

1
2
3
4
5
<?php
echo intdiv(9,3),PHP_EOL;
echo intdiv(10,3),PHP_EOL;
echo intdiv(5,10),PHP_EOL;
?>

输出:
3
3
0

session
php7 以前,我们使用 session 前都是要先代用 session_strat() 函数来初始化的,但这个函数是没有参数可以传的,session 的配置都在 php.ini 文件中。
在 php7 后 session_start() 可以接受一个 array 作为参数, 用来覆盖 php.ini 文件中设置的会话配置选项。

1
2
3
4
5
6
7
session_start([
'cache_limiter' => 'private', //在读取完毕会话数据之后马上关闭会话存储文件
'cookie_lifetime'=>3600, //SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废
'read_and_close'=>true //在读取完会话数据之后, 立即关闭会话存储文件,不做任何修改
]);
$_SESSION['name']='quan';
echo $_SESSION['name'];