PHP7新特性

PHP 标量类型与返回值类型声明

默认情况下,所有的PHP文件都处于弱类型校验模式。

PHP7增加了标量类型声明的特性,标量类型声明有两种模式:

1. 强制模式 (默认)
2. 严格模式 (强类型)

参数类型:int、 string、 float、 bool、 interfaces、 array、 callable
代码示例:

1
2
3
4
5
6
7
8
declare(strict_types=1); //开启严格模式
function sum(int ...$ints)
{
return array_sum($ints);
}
print(sum(2, '3', 4.1)); //PHP Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in.....
print(sum(1, 3, 6)); //正确

PHP NULL 合并运算符

PHP7新增加的 NULL 合并运算符(??)是用于执行isset()检测的三元运算的快捷方式。
NULL 合并运算符会判断变量是否存在且值不为NULL,如果是,它就会返回自身的值,否则返回它的第二个操作数。
代码示例:

1
2
$site = isset($_GET['site']) ? $_GET['site'] : '菜鸟教程'; //PHP7前写法
$site = $_GET['site'] ?? '菜鸟教程'; //PHP7 NULL合并运算符 ??

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

PHP 7 新增加的太空船运算符(组合比较符)用于比较两个表达式 $a 和 $b,如果 $a 小于、等于或大于 $b时,它分别返回-1、0或1。

代码示例:

1
2
3
4
//整型比较
print( 1 <=> 1);print(PHP_EOL); //返回0
print( 1 <=> 2);print(PHP_EOL); //返回-1
print( 2 <=> 1);print(PHP_EOL); //返回1

PHP 常量数组

在PHP5.6中仅能通过 const 定义常量数组,PHP7 可以通过 define() 来定义。

代码示例:

1
2
3
4
5
6
define('sites', [
'baidu',
'qq',
'google'
'taobao'
]);

PHP 匿名类

PHP7支持通过 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
27
28
29
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) {
error_log($msg . PHP_EOL, 3, 'my_xiangqian.log');
print($msg);
}
});
$app->getLogger()->log("我的第一条日志");

PHP Closure::call()

PHP 7 的 Closure::call() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{
private $x = 1;
}
//PHP7之前定义闭包函数代码
$getXCB = function()
{
return $this->x;
}
//闭包函数绑定到类A上
$getX = $getXCB->bindTo(new A, 'A');
echo $getX . PHP_EOL;
//PHP7+代码
$getX = function()
{
return $this->x;
}
echo $getX->call(new A) . PHP_EOL;

PHP 过滤 unserialize()

PHP IntlChar()

PHP CSPRNG

PHP7 异常

PHP7 use 语句

PHP7可以使用一个 use 从同一个 namespace 中导入类、函数和常量
示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//PHP7之前版本需要使用多次 use
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
//PHP7+之后版本可以使用一个 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};

PHP7 错误处理

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。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MathDemo
{
public function doOperation(float $a, float $b) : float
{
try {
return $a % $b;
} catch (DivisionByZeroError $e) {
return 0;
}
}
}
$obj = new MathDemo();
echo $obj->doOperation(10, 0) . PHP_EOL;

PHP intdiv() 函数

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

1
2
3
echo intdiv(9,3),PHP_EOL; //3
echo intdiv(10,3),PHP_EOL; //2
echo intdiv(5,10),PHP_EOL; //0

PHP7 Session 选项

PHP7 废弃特性

  1. PHP4 风格的构造函数
  2. 以静态的方式调用非静态方法
  3. password_hash() 随机因子选项
  4. capture_session_meta SSL 上下文选项

PHP7 移除的扩展

  1. ereg
  2. mssql
  3. mysql
  4. sybase_ct

PHP7 移除的 SAPI

  1. aolserver
  2. apache
  3. apache_hooks
  4. apache2filter
  5. caudium
  6. continuity
  7. isapi
  8. milter
  9. nsapi
  10. phttpd
  11. pi3web
  12. roxen
  13. thttpd
  14. tux
  15. webjames