Fork me on GitHub

PHP7新特性

目前 PHP 的最新版本是 7.2.9 ,从 PHP 5.6 到 PHP 7 发生了许多变化。在Mac系统下可用php-version工具来切换php版本。

参考资料:

一些PHP 7.0 新特性/变更

7.0 新特性

  • null合并运算符

  • 变量类型声明

变量类型声明可以有两种模式:强制(默认)和严格模式。类型参数可以定义为:字符串(string)、整形(int)、浮点型(float)以及布尔值(bool)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

function sumOfInts(int ...$ints)
{
return array_sum($ints);
}

var_dump(sumOfInts(2, '3', 4.1)); // int(9)


// 开启类型声明严格模式,declare 语句需要放在脚本第一行
declare(strict_types=1);

function add(int $x, int $y)
{

return $x + $y;
}
var_dump(add(2, 3)); //Fatal error: Argument 1 passed to add() must be of the type integer
  • 返回值类型声明
  • 组合比较符(添加’<=>’运算符)

组合比较符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。

1
2
3
4
5
<?php
// 整数
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
  • 通过define()定义常量数组

  • 支持通过new class来实例化一个匿名类

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
<?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;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});

var_dump($app->getLogger());
?>
  • Closure::call()新式闭包绑定
1
2
3
4
5
6
7
8
9
10
11
<?php
class A {private $x = 1;}

// PHP 7 之前版本的代码
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
echo $getX();

// PHP 7+ 及更高版本的代码
$getX = function() {return $this->x;};
echo $getX->call(new A);
  • 预期

提供当断言失败时抛出特定异常的能力

1
2
3
4
5
6
7
<?php
ini_set('assert.exception', 1);

class CustomError extends AssertionError {}

assert(false, new CustomError('Some error message')); //结果为Fatal error: Uncaught CustomError: Some error message
?>
  • 新添整数除法函数 intdiv()
1
var_dump(intdiv(10, 3)); // int(3)
  • 会话选项

session_start() 可以接受一个 array 作为参数, 用来覆盖 php.ini 文件中设置的 会话配置选项。

不向后兼容的变更

错误和异常处理相关的变更

在 PHP 7 中,很多致命错误以及可恢复的致命错误,都被转换为异常来处理了。 这些异常继承自 Error 类,此类实现了 Throwable 接口 (所有异常都实现了这个基础接口)

Throwable层次结构

1
2
3
4
5
6
7
8
9
interface Throwable
|- Exception implements Throwable
|- ...
|- Error implements Throwable
|- TypeError extends Error
|- ParseError extends Error
|- AssertionError extends Error
|- ArithmeticError extends Error
|- DivisionByZeroError extends ArithmeticError

为了兼容 PHP 5 和 PHP 7, 应该修改set_exception_handler(), 不应该指定参数类型为Exception,因为传递进来的参数类型可能为Error。

1
2
3
4
5
6
7
8
9
10

// PHP 5 时代的代码将会出现问题
function handler(Exception $e) { }
set_exception_handler('handler');

// 兼容 PHP 5 和 7
function handler($e) { }

// 仅支持 PHP 7
function handler(Throwable $e) { }

被移除的函数

  • 所有的ereg*函数

  • mcrypt 别名
    已废弃的 mcrypt_generic_end() 函数已被移除,请使用mcrypt_generic_deinit()代替。

此外,已废弃的 mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() 和 mcrypt_ofb() 函数已被移除,请配合恰当的MCRYPTMODE* 常量来使用 mcrypt_decrypt()进行代替

  • 所有 ext/mysql 函数

其它变更

  • $HTTP_RAW_POST_DATA 被移除

$HTTP_RAW_POST_DATA 被移除,使用php://input代替

  • new 操作符创建的对象不能以引用方式赋值给变量
1
2
3
4
5

<?php
class C {}
$c =& new C;
?>

在 PHP 7 中将发生语法错误

  • 在 PHP 7 中使用 PHP4 风格的构造函数,PHP7 会产生 E_DEPRECATED 警告。 如果还定义了 __construct() 方法则不受影响。

一些 7.1 新特性/变更

新特性

  • 添加返回值类型void

  • 短数组语法[]

短数组语法([])现在作为list()语法的一个备选项,可以用于将数组的值赋给一些变量(包括在foreach中)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$data = [
[1, 'Tom'],
[2, 'Fred'],
];

// list() style
list($id1, $name1) = $data[0];

// [] style
[$id1, $name1] = $data[0];

// list() style
foreach ($data as list($id, $name)) {
// logic here with $id and $name
}

// [] style
foreach ($data as [$id, $name]) {
// logic here with $id and $name
}
  • 可设置类常量可见性

  • 多异常捕获处理

  • list()现在支持键名

  • 支持为负的字符串偏移量

不向后兼容的变更

  • 当传递参数过少时将抛出错误

在之前传递参数过少时将抛出警告(warning),现在将抛出异常(Error execption)。

废弃的特性

  • 移除ext/mcrypt

此扩展被 OpenSSL 所取代。

------本文结束感谢阅读------
欣赏此文?求鼓励,求支持!