[转自: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. WebClient.DownLoadString报错:连接被意外关闭

    调用WebClient的DownLoadString方法调用接口,当数据量比较小的时候(十几条数据)一切正常.后来对方突然放了一千多条数据,然后就报错了:连接被意外关闭. 先是以为是对方接口没有在输出 ...

  2. UWP: 通过命令行启动 UWP 应用

    最近在开发应用的过程中,我遇到了如标题所述的需求,其实主要是为了能够快捷启动应用,正像我们可以在"运行"对话框中可以输入一些可执行程序的名称后,就能够直接启动它:这样做,可以增加 ...

  3. NodeJS、NPM安装配置与测试步骤(windows版本)

    1.windows下的NodeJS安装是比较方便的(v0.6.0版本之后,支持windows native),只需要登陆官网(http://nodejs.org/),便可以看到首页的"INS ...

  4. jsonArray与 jsonObject区别与js取值

    一.JSONObject和JSONArray的数据表示形式 JSONObject的数据是用 {  } 来表示的, 例如:   { "id" : "123", & ...

  5. mysql 分组和聚合函数

    mysql 分组和聚合函数 Mysql 聚集函数有5个: 1.COUNT() 记录个数(count(1),count(*)统计表中行数,count(列名)统计列中非null数) 2.MAX() 最大值 ...

  6. 【js 实践】js 实现木桶布局

    还有两个月左右就要准备实习了,所以特意练一练,今天终于搞定了js 的木桶布局了 这一个是按照一个插件的规格去写的以防以后工作需要,详细的解释在前端网这里 http://www.qdfuns.com/n ...

  7. Linux - ubuntu 设置固定ip和设置dns

    ubuntu 设置固定ip和设置dns 1.ifconfig 查看网卡名称 root@jiqing-virtual-machine:~# ifconfig ens32 Link encap:以太网 硬 ...

  8. 安卓开发-intent在Activity之间数据传递

    安卓开发-intent在Activity之间数据传递 [TOC] intent实现普通跳转 使用intent的setclass方法,示例(由此界面跳转到NewActivity界面) //使用setOn ...

  9. Django_form验证

    需求: 当用户向Django后端以post提交数据的时候,无论前端是否进行数据合法验证,后端都需要对客户端提交过来的数据进行数据合法性验证,是否可以利用models中表类字段的约束来实现验证,并且可以 ...

  10. 浏览器http的缓存机制

    原文出处-----分享从伯乐在线看到的一篇好文章  http://web.jobbole.com/85509/ 针对浏览器的http缓存的分析也算是老生常谈了,每隔一段时间就会冒出一篇不错的文章,其原 ...