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 相关文章推荐
PHP 中dirname(_file_)讲解
Mar 18 PHP
PHP 根据IP地址控制访问的代码
Apr 22 PHP
PHP 金额数字转换成英文
May 06 PHP
谷歌音乐搜索栏的提示功能php修正代码
May 09 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
Apr 17 PHP
PHP树形结构tree类用法示例
Feb 01 PHP
Yii框架中使用PHPExcel的方法分析
Jul 25 PHP
基于Laravel 5.2 regex验证的正确写法
Sep 29 PHP
laravel 字段格式化 modle 字段类型转换方法
Sep 30 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
Apr 14 PHP
PHP实现简单注册登录系统
Dec 28 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
简单的用PHP编写的导航条程序
2006/10/09 PHP
php学习之 认清变量的作用范围
2010/01/26 PHP
php的4种常见运行方式
2015/03/20 PHP
js时间日期和毫秒的相互转换
2013/02/22 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
Node.js中的事件驱动编程详解
2014/08/16 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
对Python中数组的几种使用方法总结
2018/06/28 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
如何基于Python按行合并两个txt
2020/11/03 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
YII2 全局异常处理深入讲解
2021/03/24 PHP
护理专业自荐信
2013/12/03 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL