php7 新增功能实例总结


Posted in PHP onMay 25, 2020

本文实例总结了php7 新增功能。分享给大家供大家参考,具体如下:

一、核心

  • 增加了group use语法声明。RFC: https://wiki.php.net/rfc/group_use_declarations
  • 增加了null合并运算符??。RFC: https://wiki.php.net/rfc/isset_ternary
  • 64位PHP7字符串长度可以超过2^31次方字节。
  • 增加了Closure::call()方法。
  • 双引号字符串和heredocs里面支持使用\u{xxxxx}来声明unicode字符。
  • define()可以把一个数组定义为常量。
  • 增加了合并比较运算符<=>。RFC: https://wiki.php.net/rfc/combined-comparison-operator
  • 增加了yield from 操作符。https://wiki.php.net/rfc/generator-delegation
  • 关键词在特定的场景中也可以使用了。RFC: https://wiki.php.net/rfc/context_sensitive_lexer
  • 增加了标量类型声明功能。RFC: https://wiki.php.net/rfc/scalar_type_hints_v5
  • 增加接口为用户层提供安全方便的随机数生成器。RFC: https://wiki.php.net/rfc/easy_userland_csprng


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

标量类型声明

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

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

  • 强制模式 (默认)严格模式

  • 严格模式

标量类型声明语法格式:

declare(strict_types=1);

代码中通过指定 strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。

可以使用的类型参数有:

  • int

  • float

  • bool

  • string

  • interfaces

  • array

  • callable

强制模式实例:

<?php 
// 强制模式 
function sum(int ...$ints) { 
 return array_sum($ints); 
} 
 
print(sum(2, '3', 4.1));
?>

以上程序执行输出结果为:

9

实例汇总将参数 4.1 转换为整数 4 后再相加。

严格模式实例:

<?php 
// 严格模式 
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……


返回类型声明

PHP 7 增加了对返回类型声明的支持,返回类型声明指明了函数返回值的类型。

可以声明的返回类型有:

  • int

  • float

  • bool

  • string

  • interfaces

  • array

  • callable

返回类型声明实例:

实例中,要求返回结果为整数:

<?php 
declare(strict_types=1); 
function returnIntValue(int $value): int { 
return $value; 
} 
 
print(returnIntValue(5)); 
?>

以上程序执行输出结果为:

5

返回类型声明错误实例:

<?php 
declare(strict_types=1); 
function returnIntValue(int $value): int { 
return $value + 1.0; 
} 
 
print(returnIntValue(5)); 
?>

以上程序由于采用了严格模式,返回值必须是 int,但是计算结果是float,所以会报错,执行输出结果为:

Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...

②PHP NULL 合并运算符

PHP 7 新增加的 NULL 合并运算符(??)是用于执行isset()检测的三元运算的快捷方式。

NULL 合并运算符会判断变量是否存在且值不为NULL,如果是,它就会返回自身的值,否则返回它的第二个操作数。

以前我们这样写三元运算符:

$site = isset($_GET['site']) ? $_GET['site'] : 'PHP中文网';

现在我们可以直接这样写:

$site = $_GET['site'] ?? 'PHP中文网';

实例

<?php 
// 获取 $_GET['site'] 的值,如果不存在返回 'PHP中文网' 
$site = $_GET['site'] ?? 'PHP中文网'; 
print($site); 
print(PHP_EOL); // PHP_EOL 为换行符 
 
// 以上代码等价于 $site = isset($_GET['site']) ? $_GET['site'] : 'PHP中文网'; 
 
print($site); 
print(PHP_EOL); // ?? 链 $site = $_GET['site'] ?? $_POST['site'] ?? 'PHP中文网'; print($site); 
?>

以上程序执行输出结果为:

PHP中文网
PHP中文网
PHP中文网

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

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

实例

<?php 
// 整型比较 
print( 1 <=> 1);
print(PHP_EOL); 
print( 1 <=> 2);
print(PHP_EOL); 
 
print( 2 <=> 1);
print(PHP_EOL); 
print(PHP_EOL); 
// PHP_EOL 为换行符 
 
// 浮点型比较 
print( 1.5 <=> 1.5);
print(PHP_EOL); 
print( 1.5 <=> 2.5);
print(PHP_EOL); 
 
print( 2.5 <=> 1.5);
print(PHP_EOL); 
print(PHP_EOL); 
 
// 字符串比较 
print( "a" <=> "a");
print(PHP_EOL); 
print( "a" <=> "b");
print(PHP_EOL); 
print( "b" <=> "a");
print(PHP_EOL); 
?>

以上程序执行输出结果为:

0
-1
1
 
0
-1
1
 
0
-1
1

④PHP 常量数组

在 PHP 5.6 中仅能通过 const 定义常量数组,PHP 7 可以通过 define() 来定义。

实例

<?php
// 使用 define 函数来定义数组
define('sites', [ 'Google', 'PHP', 'Taobao']);
print(sites[1]);
?>

以上程序执行输出结果为:

PHP

⑤PHP Closure::call()

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

实例

<?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

⑥PHP CSPRNG

CSPRNG(Cryptographically Secure Pseudo-Random Number Generator,伪随机数产生器)。

PHP 7 通过引入几个 CSPRNG 函数提供一种简单的机制来生成密码学上强壮的随机数。

  • random_bytes() - 加密生存被保护的伪随机字符串。

  • random_int() - 加密生存被保护的伪随机整数

random_bytes()

语法格式

string random_bytes ( int $length )

参数

  • length - 随机字符串返回的字节数。

返回值

  • 返回一个字符串,接受一个int型入参代表返回结果的字节数。

实例

<?php 
$bytes = random_bytes(5); 
print(bin2hex($bytes)); 
?>

以上程序执行输出结果为:

6f36d48a29

random_int()

语法格式

int random_int ( int $min , int $max )

参数

  • min - 返回的最小值,必须是大于或等于 PHP_INT_MIN 。

  • max - 返回的最大值,必须是小于或等于 PHP_INT_MAX 。

返回值

  • 返回一个指定范围内的int型数字。

实例

<?php 
print(random_int(100, 999)); 
print(PHP_EOL); 
print(random_int(-1000, 0)); 
?>

以上程序执行输出结果为:

723
-64

⑦PHP 匿名类

PHP 7 支持通过 new class 来实例化一个匿名类,这可以用来替代一些"用后即焚"的完整类定义。

实例

<?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("我的第一条日志"); 
?>

以上程序执行输出结果为:

我的第一条日志

⑧PHP 7 use 语句

PHP 7 可以使用一个 use 从同一个 namespace 中导入类、函数和常量:

// PHP 7 之前版本需要使用多次 
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; 
 
// 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}; 
?>

二、Opcache模块

  • 增加了基于文件的二级opcode 缓存机制。可以在php.ini文件中设置opcache.file_cache=<DIR>。当服务重启或者SHM重置的时候,使用二级文件缓存机制可以提高性能。
  • 也可以设置opcache.file_cache_only=1来限定只使用文件缓存。
  • 可以设置opcache.file_cache_consistency_checks=0参数来加快加载速度。
  • 可以设置opcache.huge_code_pages=0/1来决定是否将PHP code pages放到huage pages里面。http://www.laruence.com/2015/10/02/3069.html
  • windows版本增加了opcache.file_cache_fallback=1 配置项。

三、OpenSSL模块

增加了"alpn_protocols”选项。

四、反射

  • 增加了ReflectionGenerator类,用于yield from Traces, current file/line等等。
  • 增加了ReflectionType类,更好的支持新的返回值和标量声明功能。

五、流

windows版本增加了块读取的选项。可以通过传递array("pipe" => array("blocking" => true))参数来激活。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php中ob(Output Buffer 输出缓冲)函数使用方法
Jul 21 PHP
php chr() ord()中文截取乱码问题解决方法
Sep 08 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
Mar 28 PHP
解析Ubuntu下crontab命令的用法
Jun 24 PHP
php数组转换js数组操作及json_encode的用法详解
Oct 26 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
简单的php+mysql聊天室实现方法(附源码)
Jan 05 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 PHP
Ubuntu 16.04下安装PHP 7过程详解
Mar 28 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
Jun 03 PHP
PHP强制转化的形式整理
May 22 #PHP
Yii 框架入口脚本示例分析
May 19 #PHP
Yii 框架使用数据库(databases)的方法示例
May 19 #PHP
PHP7生产环境队列Beanstalkd用法详解
May 19 #PHP
PHP项目多语言配置平台实现过程解析
May 18 #PHP
Yii 框架使用Forms操作详解
May 18 #PHP
thinkphp 框架数据库切换实现方法分析
May 18 #PHP
You might like
10个实用的PHP代码片段
2011/09/02 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
javascript实现回到顶部特效
2015/05/06 Javascript
使用jquery实现仿百度自动补全特效
2015/07/23 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
浅析Vue项目中使用keep-Alive步骤
2018/07/27 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
JavaScript canvas实现跟随鼠标事件
2020/02/10 Javascript
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
Python常用模块用法分析
2014/09/08 Python
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
python分数表示方式和写法
2019/06/26 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
pytorch之添加BN的实现
2020/01/06 Python
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
考核评语大全
2014/04/29 职场文书
电视节目策划方案
2014/05/16 职场文书
服装设计师求职信
2014/06/04 职场文书
安全生产年活动总结
2014/08/29 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
员工激励培训演讲稿
2014/09/16 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
给老师的一封感谢信
2015/01/20 职场文书
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python