PHP7新特性简述


Posted in Javascript onJune 11, 2017

类型声明

看代码,一目了然了。

class person
{
  public function age(int $age) : string
  {
    return 'Age is ' . $age;
  }
}

命名空间与use关键字批量声明

非混合模式

use Publishers\Packt\{ Book, Ebook, Video};
use function Publishers\Packt\{ getBook, saveBook };
use const Publishers\Packt\{ COUNT, KEY };

混合模式

use Publishers\Packt\{
  Book,
  Ebook,
  Video,
  function getBook,
  function saveBook,
  const COUNT,
  const KEY
};

复合模式

use Publishers\Packt\{
  Paper\Book,
  Electronic\Ebook,
  Media\Video
};

匿名类

匿名类的声明与使用时同时进行的,具备其他类所具备的所以功能,区别在于匿名类没有类名。语法如下:

new class(argument) { definition };

匿名类是没有类名的,但在PHP内部,会在内存的引用地址表中为其分配一个全局唯一的名称。

$name = new class('You') {
  public function __construct($name)
  {
    echo $name;
  }
};

匿名类可以继承父类及父类的方法。

class Packt
{
  protected $number;
  public function __construct()
  {
    echo 'parent construct';
  }
  public function getNumber() : float
  {
    return $this->number;
  }
}
$number = new class(5) extends Packt
{
  public function __construct(float $number)
  {
    parent::__construct();
    $this->number = $number;
  }
};
echo $number->getNumber();

匿名类可以继承接口。

interface Publishers
{
  public function __construct(string name, string address);
  public function getName();
  public function getAddress();
}
class packt
{
  protected $number;
  protected $name;
  protected $address;
  public function ...
}
$info = new class('name', 'address') extends Packt implement Publishers
{
  public function __construct(string $name, string $address)
  {
    $this->name = $name;
    $this->address = $address;
  }
  public function getName() : string
  {
    return $this->name;
  }
  public function getAddress() : string
  {
    return $this->address;
  }
}
echo $info->getName() . ' ' . $info->getAddress();

匿名类可以嵌套在一个类中使用。

class Math
{
  public $first_number = 10;
  public $second_number = 10;
  public function add() : float
  {
    return $this->first_number + $this->second_number;
  }
  public function mutiply_sum()
  {
    return new class() extends Math
    {
      public function mutiply(float $third_number) : float
      {
        return $this->add() * $third_number;
      }
    };
  }
}
$math = new Math();
echo $math->mutiply_sum()->mutiply(2);

摒弃老式构造函数

从PHP4开始,构造函数可以通过命名与类名一致的方式来声明自己是构造函数,在PHP7中这种方式声明构造函数依然可以使用,但不推荐使用,会输出不推荐的信息 Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Packt has a deprecated constructor in ...,PHP7中推荐使用 __construct()。

throwable接口

从PHP7开始,程序中的fatal错误都可以被截获,PHP7提供了throwable接口,异常与错误都继承于这个接口。

Error

现在大多数的fatal错误情况会抛出一个error实例,类似于截获异常,error实例可以被try/catch截获。

try
{
  ...
} catch(Error $e)
{
  echo $e->getMessage();
}

一些错误情况只有error的子实例会被抛出,例如 TypeError、DivisionByZeroError、ParseError等。

<=>操作符

<=>操作符将==、<、>三个比较操作符打包在了一起,具体使用规则如下。

操作符两边相等时返回 0

操作符左边小于右边时返回 -1

操作符左边大于右边时返回 1

null合并运算符

?? 合并运算符,在第一操作数存在时可被直接返回,否则返回第二操作数。

$title = $post['title'] ?? NULL;
$title = $post['title'] ?? $get['title'] ?? 'No title';

uniform变量语法

$first = ['name' => 'second'];
$second = 'two';
echo $$first['name'];
echo ${Sfirst['name']}; // PHP7
...
echo $object->$methods['title'];
echo $object->{$methods['title']}; // PHP7

主要是因为PHP7与之前版本PHP的解析方式不一样,在PHP7中加上花括号就可以啦,就像上边代码这样,否则会报错。

常量数组

从PHP5.6开始常量数组可以用const关键字来声明,在PHP7中常量数组可以通过define函数来初始化。

const STORES = ['en', 'fr', 'ar']; // php5.6
define('STORES', ['en', 'fr', 'ar']); // php7

switch中的default默认值

在PHP7之前,switch语句中允许多个default默认值,从PHP7开始,只能有一个default默认值,否则会产生fatal级别错误。

// php7之前
switch (true) {
  case 'value':
    # code...
    break;
  default:
    # code...
    break;
  default:
    # code...
    break;
}
// php7
switch (true) {
  case 'value':
    # code...
    break;
  default:
    # code...
    break;
}

session_start函数中的选项数组

在PHP7之前,使用session的时候都必须先调用session_start()函数,且这个函数并没有参数需要传递,所有session相关的配置都在php.ini文件中,从PHP7开始,可以在调用这个函数时传递参数选项数组,这些设置信息将覆盖php.ini中的session配置。

session_start([
  'cookie_lifetime' => 3600,
  'read_and_close' => true
]);

unserialize函数引入过滤器

unserialize()可以反序列化任何类型的对象,没有任何过滤项,不安全,PHP7在unserialize()中引入了过滤器,且默认允许反序列化所有类型的对象。

$result = unserialize($object, ['allowed_classes' => ['Book', 'Ebook']]);

以上所述是小编给大家介绍的PHP7新特性简述,希望对大家有所帮助!

Javascript 相关文章推荐
extjs render 用法介绍
Sep 11 Javascript
AngularJS学习笔记之TodoMVC的分析
Feb 22 Javascript
Javascript对象Clone实例分析
Jun 09 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
Nov 23 Javascript
js获取上传文件的绝对路径实现方法
Aug 02 Javascript
jQuery实现页面点击后退弹出提示框的方法
Aug 24 Javascript
基于jQuery实现照片墙自动播放特效
Jan 12 Javascript
详解javascript中对数据格式化的思考
Jan 23 Javascript
jQuery操作DOM_动力节点Java学院整理
Jul 04 jQuery
详解Webpack + ES6 最新环境搭建与配置
Jun 04 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
Sep 13 Javascript
微信小程序实现左滑删除效果
Nov 18 Javascript
jquery与js实现全选功能的区别
Jun 11 #jQuery
jQuery 表单序列化实例代码
Jun 11 #jQuery
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
Jun 11 #jQuery
基于angular实现模拟微信小程序swiper组件
Jun 11 #Javascript
JavaScrpt判断一个数是否是质数的实例代码
Jun 11 #Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
Jun 11 #Javascript
jQuery复合事件结合toggle()方法的用法示例
Jun 10 #jQuery
You might like
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
javascript String 对象
2008/04/25 Javascript
javascript oop开发滑动(slide)菜单控件
2010/08/25 Javascript
浅谈window对象的scrollBy()方法
2015/07/15 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
Python正则表达式教程之二:捕获篇
2017/03/02 Python
详解python eval函数的妙用
2017/11/16 Python
pandas数据集的端到端处理
2019/02/18 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
python 实现简单的FTP程序
2019/12/27 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
如何利用python生成MD5并去重
2020/12/07 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
行政助理岗位职责
2013/11/10 职场文书
求职简历中个人的自我评价
2013/12/01 职场文书
服务标语大全
2014/06/18 职场文书
政风行风建设责任书
2014/07/23 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
3.15消费者权益日活动总结
2015/02/09 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android