欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP7新特性简述

程序员文章站 2022-07-05 20:46:15
类型声明 看代码,一目了然了。 class person { public function age(int $age) : string {...

类型声明

看代码,一目了然了。

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新特性简述,希望对大家有所帮助!