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 相关文章推荐
JQquery的一些使用心得分享
Aug 01 Javascript
seajs中模块的解析规则详解和模块使用总结
Mar 12 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
Jun 06 Javascript
javascript数组排序汇总
Jul 07 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
Jan 27 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
Jan 29 Javascript
vue数据双向绑定的注意点
Jun 23 Javascript
jquery 键盘事件的使用方法详解
Sep 13 jQuery
Vue下路由History模式打包后页面空白的解决方法
Jun 29 Javascript
基于Angularjs-router动态改变Title值的问题
Aug 30 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
Mar 16 jQuery
vue项目中mock.js的使用及基本用法
May 22 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
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
php天翼开放平台短信发送接口实现方法
2014/12/22 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
js实现文字截断功能
2016/09/14 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
Vue.js项目部署到服务器的详细步骤
2017/07/17 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
Python全局变量操作详解
2015/04/14 Python
部署Python的框架下的web app的详细教程
2015/04/30 Python
Python类定义和类继承详解
2015/05/08 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
外贸业务员岗位职责
2013/11/24 职场文书
自我鉴定怎么写
2013/12/05 职场文书
小学新学期教师寄语
2014/01/18 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
SQL中的三种去重方法小结
2021/11/01 SQL Server
vue使用watch监听属性变化
2022/04/30 Vue.js