[转自:http://www.yiibai.com/php7/ ]
 
【PHP7标量类型声明】
在PHP7,一个新的功能,标量类型声明已被引入。标量类型声明有两种选择方式 -
  • 强制方式- 强制性是默认模式,不需要指定

  • 严格方式 - 严格模式有明确的暗示

以下几种类型的函数参数可以通过上述模式被强制执行 -
  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable
示例 - 强制模式
<?php
// Coercive mode
function sum(int ...$ints) {
return array_sum($ints);
}
print(sum(, '', 4.1));
?>

这将在浏览器产生输出以下结果:

9
 
示例 - 严格模式
<?php
// Strict mode
declare(strict_types=);
function sum(int ...$ints) {
return array_sum($ints);
}
print(sum(, '', 4.1));
?>
这将在浏览器产生输出以下结果-
Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, ... 

【PHP7返回类型声明】

在PHP7,一个新的功能,返回类型声明已被引入。返回类型声明指定的一个函数返回值的类型。以下类型可以用来作为返回类型声明。
  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable
示例 - 有效的返回类型
<?php
declare(strict_types = );
function returnIntValue(int $value): int {
return $value;
}
print(returnIntValue());
?>
这将在浏览器产生输出以下结果:
5
示例 - 无效的返回类型
<?php
declare(strict_types = );
function returnIntValue(int $value): int {
return $value + 1.0;
}
print(returnIntValue());
?>
这将在浏览器产生输出以下结果-
Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...

【PHP7 Null合并运算符】

$a = $_GET['a'] ?? 1;

它相当于:

$a = isset($_GET['a']) ? $_GET['a'] : 1;

我们知道三元运算符是可以这样用的:

$a ?: 1

但是这是建立在 $a 已经定义了的前提上。新增的 ?? 运算符可以简化判断。

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中加上花括号就可以啦,就像上边代码这样,否则会报错。

【PHP7  <=>操作符】 

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

操作符两边相等时返回 0
操作符左边小于右边时返回 -1
操作符左边大于右边时返回 1

<?php
//integer comparison
print( <=> );print("<br/>");
print( <=> );print("<br/>");
print( <=> );print("<br/>");
print("<br/>");
//float comparison
print( 1.5 <=> 1.5);print("<br/>");
print( 1.5 <=> 2.5);print("<br/>");
print( 2.5 <=> 1.5);print("<br/>");
print("<br/>");
//string comparison
print( "a" <=> "a");print("<br/>");
print( "a" <=> "b");print("<br/>");
print( "b" <=> "a");print("<br/>");
?>
这将在浏览器产生输出以下结果:
0
-1
1 0
-1
1 0
-1
1

【PHP7常量数组】 

数组常量现在可以使用 define() 函数定义。 在PHP5.6,它们只能使用 const 关键字定义。
<?php
//define a array using define function
define('animals', [
'dog',
'cat',
'bird'
]);
print(animals[]);
?>
这将在浏览器产生输出以下结果:
cat

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

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

 【PHP7 use语句】

从PHP7起,单次使用 use 语句可以用来从同一个命名空间导入类,函数和常量(而不用多次使用 use 语句)。
<?php
// Before PHP 7
use com\yiibai\ClassA;
use com\yiibai\ClassB;
use com\yiibai\ClassC as C; use function com\yiibai\fn_a;
use function com\yiibai\fn_b;
use function com\yiibai\fn_c; use const com\yiibai\ConstA;
use const com\yiibai\ConstB;
use const com\yiibai\ConstC; // PHP 7+ code
use com\yiibai\{ClassA, ClassB, ClassC as C};
use function com\yiibai\{fn_a, fn_b, fn_c};
use const com\yiibai\{ConstA, ConstB, ConstC}; ?>

【PHP7整数除法】

PHP7引入了intdiv()的新函数,它执行操作数的整数除法并返回结果为 int 类型。
<?php
$value = intdiv(,);
var_dump($value);
print($value);
?>

这将在浏览器产生以下输出:

int(3)
3

函数返回值类型声明 和 标量类型声明 的重点说明

官方文档提供的例子(注意 … 的边长参数语法在 PHP 5.6 以上的版本中才有):

<php
function arraysSum(array ...$arrays): array
{
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
} print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

从这个例子中可以看出现在函数(包括匿名函数)都可以指定返回值的类型。

这个特性可以帮助我们避免一些 PHP 的隐式类型转换带来的问题。在定义一个函数之前就想好预期的结果可以避免一些不必要的错误。

不过这里也有一个特点需要注意。PHP 7 增加了一个 declare 指令:strict_types,既使用严格模式。

使用返回值类型声明时,如果没有声明为严格模式,如果返回值不是预期的类型,PHP 还是会对其进行强制类型转换。但是如果是严格模式, 则会出发一个 TypeError 的 Fatal error。

强制模式:

<php
function foo($a) : int
{
return $a;
} foo(1.0);

以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。

严格模式:

<php
declare(strict_types=1); function foo($a) : int
{
return $a;
} foo(1.0);
# PHP Fatal error: Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6

在声明之后,就会触发致命错误。

◆ 标量类型声明

PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。

官方示例:

<php
// Coercive mode
function sumOfInts(int ...$ints)
{
return array_sum($ints);
} var_dump(sumOfInts(, '', 4.1));

需要注意的是上文提到的严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError 的致命错误。

类型声明

看代码,一目了然了。

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

匿名类

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

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() 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 = ;
public $second_number = ;
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();

PHP7的新功能的更多相关文章

  1. php7.0 和 php7.1新特性

    PHP7.1 新特性 1.可为空(Nullable)类型 类型现在允许为空,当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null .可以通过在类型前面加上一个问号来使之成为 ...

  2. 从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能

    前言 之前在 剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记 这篇随笔中介绍了一下 UWP 淘宝的“比较”新功能呱呱坠地的过程.在鲜活的文字背后,其实都是程序员不眠不休的血泪史(有血有泪有史) ...

  3. Sql Server 2016新功能之 Row-Level Security

    Sql Server 2016 有一个新功能叫 Row-Level Security ,大概意思是行版本的安全策略(原来我是个英语渣_(:з」∠)_) 直接上例子.这个功能相当通过对表添加一个函数作为 ...

  4. What's new in Windows 10 Enterprise with Microsoft Edge.(Windows 10 新功能)

    What's new in Windows 10 Enterprise with Microsoft Edge --带有Edge浏览器的Windows 10 企业版的新功能 本文摘录自公司群发邮件, ...

  5. MySQL 5.7 Replication 相关新功能说明

    背景: MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制.基于组提交的并行复制.在线修改Replication Filter.GTID增强.半同步复制增强等.因为都是和复制相关, ...

  6. SQL Server2016 新功能实时查询统计信息

    SQL Server2016 新功能实时查询统计信息 很多时候有这样的场景,开发抱怨DBA没有调优好数据库,DBA抱怨开发写的程序代码差,因此,DBA和开发都成为了死对头,无法真正排查问题. DBA只 ...

  7. 一个新人如何学习在大型系统中添加新功能和Debug

    文章背景: 今年七月份正式入职,公司主营ERP软件,楼主所在的组主要负责二次开发,使用的语言是Java. 什么叫二次开发呢?ERP软件的客户都是企业.而这些企业之间的情况都有所不同,一套标准版本的企业 ...

  8. SQL Server 2014新功能PPT

        本篇文章是我在公司内部分享SQL Server 2014新功能的PPT,在本PPT中我详细描述了SQL Server除了BI方面的新功能,以及提供了大量的测试.希望对大家有帮助.     请点 ...

  9. 【开源】OSharp3.0框架解说系列:新版本说明及新功能规划预览

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

随机推荐

  1. phpstudy最新版中php5.6版报错

  2. CentOS系统下Redis安装和自启动配置的步骤

    相信大家都知道Redis是一个C实现的基于内存.可持久化的键值对数据库,在分布式服务中常作为缓存服务.所以这篇文章将详细介绍在CentOS系统下如何从零开始安装到配置启动服务.有需要的可以参考借鉴. ...

  3. 如何查看sublime安装了哪些插件

    你应该安装过package control. 那么只要这样:按ctrl+shift+p,输入package,选择list packages,就看到了. 或者直接查看Installed Packages ...

  4. 为什么要进行URL编码

    我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割.如"?name1=value1&a ...

  5. 【开发技术】refactor 重构----实现文件改名

    当我们要改类名或接口名时,可能会遇到该类(接口)在其它文件中也有使用的情况,如一个个找比较麻烦也容易漏,这里推荐使用右键refactor->rename进行修改.

  6. MySQL数据引擎

    InnoDB存储引擎 该引擎是MySQL数据库的默认事务型引擎,它被设计用来处理大量短期事务(绝大多数正常提交,很少回滚) InnoDB的数据存储在表空间中,表空间是由InnoDB管理的一个黑盒子,由 ...

  7. VMware虚拟机上建立HTTP服务步骤

    1.使用xshell连接虚拟机,也可直接在虚拟机中敲命令. 以下是xshell上的命令: 首先安装HTTPD包 [root@one ~]# mount /dev/sr0 /mnt[root@one ~ ...

  8. Python判断文件是否存在的三种方法【转】

    转:http://www.cnblogs.com/jhao/p/7243043.html 通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做任何操作之前,先 ...

  9. crontab执行带参数的php脚本,并取得参数[转]

    现在越来越喜欢用linux了,程序当中也去掉了很多触发性判断,改用了借用linux的crontab的特性来进行,这样程序效率确实是高了很多. 比如我们每月1号清空月点击,比如每天凌晨统计上一天的访问报 ...

  10. 使用express+multer实现node中的图片上传

    使用express+multer实现node中的图片上传 在前端中,我们使用ajax来异步上传图片,使用file-input来上传图片,使用formdata对象来处理图片数据,post到服务器中 在n ...