php7新特性的理解和比较总结


Posted in PHP onApril 14, 2019

1. null合并运算符(??)

语法: 如果变量存在且值不为NULL,它就会返回自身的值,否则返回它的第二个操作数.

//php7以前 if判断 

if(empty($_GET['param'])) { 

  $param = 1; 

}else{ 

 $param = $_GET['param']; 

} 

 

//php7以前 三元运算符 

$param = empty($_GET['param']) ? 1 : $_GET['param'];

 

//PHP7 null合并运算符

 

 $param = $_GET['param'] ?? 1;//1

2. define() 定义常量数组

//php7以前 

 define("CONTENT", "hello world"); 

 echo CONTENT;//hello world 

 

 //PHP7 

 define('ANIMALS', [ 

 'dog', 

  'cat', 

 'bird'

]);

 echo ANIMALS[2];//bird

 

 //PHP7 类外也可使用const来定义常量

 const CONSTANT = 'Hello World'; 

 echo CONSTANT;//Hello World

3. 组合比较符(<=>)

组合比较符用于比较两个表达式.当$a小于、等于或大于$b时它分别返回-1、0或1. 比较的原则是沿用PHP的常规比较规则进行的.

/整数 

echo 1 <=> 1; // 0 

echo 1 <=> 2; // -1 

echo 2 <=> 1; // 1 

 

 //浮点数 

echo 1.5 <=> 1.5; // 0 

echo 1.5 <=> 2.5; // -1 

echo 2.5 <=> 1.5; // 1

 

 //字符串

echo "a" <=> "a"; // 0

echo "a" <=> "b"; // -1

echo "b" <=> "a"; // 1

4. 变量类型声明

两种模式: 强制(默认)和严格模式. 可以使用下列类型参数: string,int,float,bool

//... 操作符: 表示这是一个可变参数. php5.6及以上的版本可使用: 函数定义的时候变量前使用. 

 function intSum(int ...$ints){ 

 return array_sum($ints); 

 } 

var_dump(intSum(2,'3.5'));//5 

 

 //严格模式 

 //模式声明:declare(strict_types=1); 默认情况值为0,值为1代表为严格校验的模式 

 declare(strict_types=1);

 function add(int $a,int $b){

  return $a+$b;

 }

 var_dump(add(2,'3.5')); //Fatal error: Uncaught TypeError: Argument 2 passed to add() must be of the type integer

5. 返回值类型声明

增加返回类型声明的支持.类似于参数类型声明.(用法在函数定义的后面加 :类型名)

//有效的返回类型

declare(strict_types = 1);

 function getInt(int $value): int {

 return $value;

 }

 print(getInt(6));//6
//无效返回类型

declare(strict_types = 1);

 function getNoInt(int $value): int {

 return $value+'2.5';

 }

 print(getNoInt(6));//Fatal error: Uncaught TypeError: Return value of getNoInt() must be of the type integer

6. 匿名类

允许new class {} 创建一个匿名的对象.

<?php 

//php7以前 接口实现 

interface User{ 

 public function getDiscount(); 

} 

class VipUser implements User{ 

 //折扣系数 

 private $discount = 0.6; 

 public function getDiscount() {

  return $this->discount;

 }

}

class Goods{

 private $price = 200;

 private $objectVipUser;

 //User接口VipUser类实现

 public function getUserData($User){

  $this->objectVipUser = $User;

  $discount = $this->objectVipUser->getDiscount();

  echo "商品价格:".$this->price*$discount;

 }

}

$display = new Goods();

//常规实例化接口实现对象

$display ->getUserData(new VipUser);//商品价格:120
<?php 

//php7 创建一个匿名的对象 

interface User{ 

 public function getDiscount(); 

} 

class Goods{ 

 private $price = 200; 

 private $objectVipUser; 

 public function getUserData($User){

  $this->objectVipUser = $User;

  $discount = $this->objectVipUser->getDiscount();

  echo "商品价格:".$this->price*$discount;

 }

}

$display = new Goods();

//new匿名对象实现user接口

$display ->getUserData(new class implements User{

 private $discount = 0.6;

 public function getDiscount() {

  return $this->discount;

 }

});//商品价格:120

7. Closure::call()

Closure::call() 方法被添加为一个简短的方式来临时绑定一个对象作用域到一个闭包并调用它. 与PHP5的bindTo相比.它的性能要快得多.

<?php 

//php7以前 

class A { 

 private $attribute = 'hello world'; 

} 

 

$getClosure = function(){ 

 return $this->attribute; 

};

 

$getAttribute = $getClosure->bindTo(new A, 'A');//中间层闭包

echo $getAttribute();//hello world
<?php 

//PHP7 

class A { 

 private $attribute = 'hello world'; 

} 

 

$getClosure = function(){ 

 return $this->attribute; 

};

 

echo $getClosure->call(new A);//hello world

8. unserialize()

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

<?php 

 class A{ 

  public $name = 'admin_a'; 

 } 

 class B{ 

  public $name = 'admin_b'; 

 } 

 $objA = new A(); 

 $objB = new B(); 

 $serializedObjA = serialize($objA); 

 $serializedObjB = serialize($objB); 

 //默认行为是接收所有类; 第二个参数可以忽略

 $dataA = unserialize($serializedObjA , ["allowed_classes" => true]); 

 var_dump($dataA);//object(A)#3 (1) { ["name"]=> string(7) "admin_a" }

//如果allowed_classes设置为false,unserialize会将所有对象转换为__PHP_Incomplete_Class对象 

 $dataA = unserialize($serializedObjA , ["allowed_classes" => false]); 

 var_dump($dataA);//object(__PHP_Incomplete_Class)#4 (2) { ["__PHP_Incomplete_Class_Name"]=> string(1) "A" ["name"]=> string(7) "admin_a" }

//转换所有对象到 __PHP_Incomplete_Class对象,除了对象"B"

 $dataB = unserialize($serializedObjB , ["allowed_classes" => ["B"]]); 

var_dump($dataB);//object(B)#3 (1) { ["name"]=> string(7) "admin_b" }

9. IntlChar

IntlChar:提供了一些可用于访问Unicode字符信息的实用方法的访问. 注意:必须安装Intl扩展才能使用!

var_dump(IntlChar::CODEPOINT_MAX);//int(1114111) 

echo '<br>';

var_dump(IntlChar::charName('+'));//string(9) "PLUS SIGN" 

echo '<br>';

var_dump(IntlChar::ispunct('?'));//bool(true)

10. CSPRNG

CSPRNG 函数提供一种简单的机制来生成密码的随机数.

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

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

$bytes = random_bytes(8); 

echo(bin2hex($bytes));//随机2073a110a2e3c497

echo '<br>';

echo(random_int(1, 999));//随机786

echo '<br>';

print(random_int(-999, -1));//随机-357

11. use 语句

可以使用单个use语句从相同的命名空间导入类,函数和常量,而不是使用多个use语句.

//PHP7之前 

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 some\namespace\{ClassA, ClassB, ClassC as C};

use function some\namespace\{fn_a, fn_b, fn_c};

use const some\namespace\{ConstA, ConstB, ConstC};

12. intp

新增加intp()函数,接收两个参数,返回值为第一个参数除于第二个参数的值并取整.

echo intp(8,4);//2

echo intp(10,4);//2

echo intp(5,10);//0

13. PHP7 错误处理

PHP7 改变了大多数错误的报告方式.不同于PHP5的传统错误报告机制,现在大多数错误被作为Error异常抛出.

这种Error异常可以像普通异常一样被try / catch块所捕获. 如果没有匹配的try / catch块,则调用异常处理函数(由 set_exception_handler() 注册)进行处理.

如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error).

Error类并不是从Exception类扩展出来的,所以用catch (Exception $e) { ... } 这样的代码是捕获不到Error的.你可以用 catch (Error $e) { ... } 这样的代码,

或者通过注册异常处理函数( set_exception_handler())来捕获Error.

php7新特性的理解和比较总结

<?php 

//php7以前 自定义异常处理 

class getException extends Exception{ 

 public function errorMsg(){ 

  return '错误的信息'.$this->getMessage().'<br>错误的代码'.$this->getCode(); 

 } 

} 

 

try {

 $num =10;

 if($num > 1) {

  throw new getException($num,404);

 }

} catch (getException $e) {

 echo $e->errorMsg();

 }
<?php 

//php7 异常处理

try {

 test();

}catch(Error $e) {

 echo $e->getMessage();//Call to undefined function test()

  }
PHP 相关文章推荐
在Zeus Web Server中安装PHP语言支持
Oct 09 PHP
一个简单的域名注册情况查询程序
Oct 09 PHP
PHP 错误之引号中使用变量
May 04 PHP
php入门之连接mysql数据库的一个类
Apr 21 PHP
php数组随机排序实现方法
Jun 13 PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 PHP
PHP 接入微信扫码支付总结(总结篇)
Nov 03 PHP
浅谈PHP中的错误处理和异常处理
Feb 04 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 PHP
PHP耦合设计模式实例分析
Aug 08 PHP
PHP ElasticSearch做搜索实例讲解
Feb 05 PHP
PHP7新功能总结
Apr 14 #PHP
PHP7内核CGI与FastCGI详解
Apr 14 #PHP
Codeigniter里的无刷新上传的实现代码
Apr 14 #PHP
PHP7中I/O模型内核剖析详解
Apr 14 #PHP
浅析PHP7的多进程及实例源码
Apr 14 #PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 #PHP
php intval函数用法总结
Apr 14 #PHP
You might like
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
JavaScript Event事件学习第一章 Event介绍
2010/02/07 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
2019/05/17 jQuery
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
Python类定义和类继承详解
2015/05/08 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
python实现定时发送qq消息
2019/01/18 Python
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
python全局变量引用与修改过程解析
2020/01/07 Python
python连接mongodb集群方法详解
2020/02/13 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
基于python模拟TCP3次握手连接及发送数据
2020/11/06 Python
通过实例解析python and和or使用方法
2020/11/14 Python
python中常用的数据结构介绍
2021/01/12 Python
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
介绍一下代理模式(Proxy)
2014/10/17 面试题
新春联欢会主持词
2014/03/24 职场文书
公司周年庆典标语
2014/10/07 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
小学家长意见怎么写
2015/06/03 职场文书
Nginx搭建rtmp直播服务器实现代码
2021/03/31 Servers