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 相关文章推荐
JavaScript Eval 函数使用
Mar 23 Javascript
javascript 实用的文字链提示框效果
Jun 30 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
Mar 20 Javascript
JavaScript模拟数组合并concat
Mar 06 Javascript
js中通过getElementsByName访问name集合对象的方法
Oct 31 Javascript
JavaScript html5 canvas实现图片上画超链接
Oct 20 Javascript
JS实现百度搜索接口及链接功能实例代码
Feb 02 Javascript
jQuery中可见性过滤器简单用法示例
Mar 31 jQuery
jQuery实现的五星点评功能【案例】
Feb 18 jQuery
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
Sep 06 Javascript
bootstrap table实现iview固定列的效果实例代码详解
Sep 30 Javascript
vue 图片裁剪上传组件的实现
Nov 12 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自动获取目录下的模板的代码
2010/08/08 PHP
奇怪的PHP引用效率问题分析
2012/03/23 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
基于PHP生成简单的验证码
2016/06/01 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
在使用JSON格式处理数据时应该注意的问题小结
2017/05/20 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
Vue-cli打包后如何本地查看的操作
2020/09/02 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
Python中endswith()函数的基本使用
2015/04/07 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
为什么需要版本控制?
2013/08/08 面试题
制衣厂各岗位职责
2013/12/02 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
简单租房协议书
2014/10/21 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle