two+few+arguments+php,PHP5.5 ~ PHP7.2 新特性整理

PHP5.5 ~ PHP7.2 新特性整理

一、从PHP 5.5.x 移植到 PHP 5.6.x

使用表达式定义常量

在之前的 PHP 版本中, 必须使用静态值来定义常量,声明属性以及指定函数参数默认值。 现在你可以使用包括数值、字符串字面量以及其他常量在内的数值表达式来 定义常量、声明属性以及设置函数参数默认值。

const ONE = 1;

const TWO = ONE * 2;

class C {

const THREE = TWO + 1;

const ONE_THIRD = ONE / self::THREE;

const SENTENCE = 'The value of THREE is '.self::THREE;

}

现在可以通过 const 关键字来定义类型为 array 的常量。

const ARR = ['a', 'b'];

echo ARR[0];

使用 ... 运算符定义变长参数函数

现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数。

function f($req, $opt = null, ...$params) {

// $params 是一个包含了剩余参数的数组

printf('$req: %d; $opt: %d; number of params: %d'."\n",

$req, $opt, count($params));

}

f(1);

f(1, 2);

f(1, 2, 3);

f(1, 2, 3, 4);

?>

以上例程会输出:

$req: 1; $opt: 0; number of params: 0

$req: 1; $opt: 2; number of params: 0

$req: 1; $opt: 2; number of params: 1

$req: 1; $opt: 2; number of params: 2

使用 ... 运算符进行参数展开

在调用函数的时候,使用 ... 运算符, 将 数组 和 可遍历 对象展开为函数参数。 在其他编程语言,比如 Ruby中,这被称为连接运算符。

function add($a, $b, $c) {

return $a + $b + $c;

}

$operators = [2, 3];

echo add(1, ...$operators);

?>

以上例程会输出:

6

use function 以及 use const

use 运算符 被进行了扩展以支持在类中导入外部的函数和常量。 对应的结构为 use function 和 use const。

namespace Name\Space {

const FOO = 42;

function f() { echo __FUNCTION__."\n"; }

}

namespace {

use const Name\Space\FOO;

use function Name\Space\f;

echo FOO."\n";

f();

}

?>

以上例程会输出:

42

Name\Space\f

使用 hash_equals() 比较字符串避免时序攻击

二、从PHP 5.6.x 移植到 PHP 7.0.x

标量类型声明

标量类型声明 有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。

// Coercive mode

function sumOfInts(int ...$ints)

{

return array_sum($ints);

}

var_dump(sumOfInts(2, '3', 4.1));

以上例程会输出:

int(9)

返回值类型声明

PHP 7 增加了对返回类型声明的支持。 类似于参数类型声明,返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。

function arraysSum(array ...$arrays): array

{

return array_map(function(array $array): int {

return array_sum($array);

}, $arrays);

}

null合并运算符

由于日常使用中存在大量同时使用三元表达式和 isset()的情况, 我们添加了null合并运算符 (??) 这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

// Fetches the value of $_GET['user'] and returns 'nobody' if it does not exist.

$username = $_GET['user'] ?? 'nobody';

// This is equivalent to:

$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalesces can be chained: this will return the first defined value out of $_GET['user'], $_POST['user'], and 'nobody'.

$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

?>

太空船操作符(组合比较符)

太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。 比较的原则是沿用 PHP 的常规比较规则进行的。

// 整数

echo 1 <=> '1'; // 0

echo 1 <=> 2; // -1

echo 2 <=> 1; // 1

// 浮点数

echo '1.50' <=> 1.5; // 0

echo 1.5 <=> 2.5; // -1

echo 2.5 <=> 1.5; // 1

// 字符串

echo "a" <=> "a"; // 0

echo "a" <=> "b"; // -1

echo "b" <=> "a"; // 1

?>

通过 define() 定义常量数组

Array 类型的常量现在可以通过 define() 来定义。在 PHP5.6 中仅能通过 const 定义。

define('ANIMALS', [

'dog',

'cat',

'bird'

]);

echo ANIMALS[1]; // 输出 "cat"

Closure::call()

Closure::call() 现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它。

class A {private $x = 1;}

// PHP 7 之前版本的代码

$getXCB = function() {return $this->x;};

$getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包

echo $getX();

// PHP 7+ 及更高版本的代码

$getX = function() {return $this->x;};

echo $getX->call(new A);

以上例程会输出:

1

分组 use 声明

从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了。

// PHP 7 之前的代码

use some\namespace\ClassA;

use some\namespace\ClassB;

use some\namespace\ClassC as C;

use function some\namespace\fn_a;

use function some\namespace\fn_b;

use function some\namespace\fn_c;

use const some\namespace\ConstA;

use const some\namespace\ConstB;

use const some\namespace\ConstC;

// PHP 7+ 及更高版本的代码

use some\namespace\{ClassA, ClassB, ClassC as C};

use function some\namespace\{fn_a, fn_b, fn_c};

use const some\namespace\{ConstA, ConstB, ConstC};

?>

生成器可以返回表达式

此特性基于 PHP 5.5 版本中引入的生成器特性构建的。 它允许在生成器函数中通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次。

整数除法函数 intdiv()

从PHP 7.0.x 移植到 PHP 7.1.x

可为空(Nullable)类型

参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。 当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。

function testReturn(): ?string

{

return 'elePHPant';

}

var_dump(testReturn());

function testReturn(): ?string

{

return null;

}

var_dump(testReturn());

function test(?string $name)

{

var_dump($name);

}

test('elePHPant');

test(null);

test();

以上例程会输出:

string(10) "elePHPant"

NULL

string(10) "elePHPant"

NULL

Uncaught Error: Too few arguments to function test(), 0 passed in...

Void 函数

一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,NULL 不是一个合法的返回值。

function swap(&$left, &$right) : void

{

if ($left === $right) {

return;

}

$tmp = $left;

$left = $right;

$right = $tmp;

}

$a = 1;

$b = 2;

var_dump(swap($a, $b), $a, $b);

以上例程会输出:

null

int(2)

int(1)

Symmetric array destructuring

短数组语法([])现在作为list()语法的一个备选项,可以用于将数组的值赋给一些变量(包括在foreach中)。

$data = [

[1, 'Tom'],

[2, 'Fred'],

];

// list() style

list($id1, $name1) = $data[0];

// [] style

[$id1, $name1] = $data[0];

// list() style

foreach ($data as list($id, $name)) {

// logic here with $id and $name

}

// [] style

foreach ($data as [$id, $name]) {

// logic here with $id and $name

}

类常量可见性

现在起支持设置类常量的可见性。

class ConstDemo

{

const PUBLIC_CONST_A = 1;

public const PUBLIC_CONST_B = 2;

protected const PROTECTED_CONST = 3;

private const PRIVATE_CONST = 4;

}

iterable 伪类

现在引入了一个新的被称为iterable的伪类 (与callable类似)。 这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象。 至于子类,当用作参数时,子类可以收紧父类的iterable类型到array 或一个实现了Traversable的对象。对于返回值,子类可以拓宽父类的 array或对象返回值类型到iterable。

function iterator(iterable $iter) : iterable

{

foreach ($iter as $val) {

//

}

}

多异常捕获处理

一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。

try {

// some code

} catch (FirstException | SecondException $e) {

// handle first and second exceptions

}

list()现在支持键名

现在list()和它的新的[]语法支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)

$data = [

["id" => 1, "name" => 'Tom'],

["id" => 2, "name" => 'Fred'],

];

// list() style

list("id" => $id1, "name" => $name1) = $data[0];

// [] style

["id" => $id1, "name" => $name1] = $data[0];

// list() style

foreach ($data as list("id" => $id, "name" => $name)) {

// logic here with $id and $name

}

// [] style

foreach ($data as ["id" => $id, "name" => $name]) {

// logic here with $id and $name

}

从PHP 7.1.x 移植到 PHP 7.2.x

新的对象类型

这种新的对象类型, object, 引进了可用于逆变(contravariant)参数输入和协变(covariant)返回任何对象类型。

function test(object $obj) : object

{

return new SplQueue();

}

test(new StdClass());

允许重写抽象方法(Abstract method)

当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。

abstract class A

{

abstract function test(string $s);

}

abstract class B extends A

{

// overridden - still maintaining contravariance for parameters and covariance for return

abstract function test($s) : int;

}

扩展了参数类型

重写方法和接口实现的参数类型现在可以省略了。不过这仍然是符合LSP,因为现在这种参数类型是逆变的。

interface A

{

public function Test(array $input);

}

class B implements A

{

public function Test($input){} // type omitted for $input

}

允许分组命名空间的尾部逗号

命名空间可以在PHP 7中使用尾随逗号进行分组引入。

use Foo\Bar\{

Foo,

Bar,

Baz,

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

date设置时间_解决 IDEA 无法找到 java.util.Date 的问题

原文首发于 https://studyidea.cn/问题最近在项目中频繁使用到 java.util.Date&#xff0c;但是使用 IDEA 提示查找 Date 类&#xff0c;却无法找到 java.util.Date。可以看到&#xff0c;智能提示的结果没有 java.util.Date。没办法&#xff0c;只能暂时手动导入该包。最近闲下…

mysql插入语句例句,一句简单的MySql插入语句怎么写 ?

守候你守候我insert into 表名 values(default,"名字","2011-04-15 12:22:25"); //default可以换成null------------------------------insert into 表名 (name,datetime) values("名字","2011-04-15 12:22:25");使用SQL语法大写&…

vue key重复_【第2112期】 import { reactive } from #39;vue#39;

前言今日早读文章由Anthony Fu授权分享。Anthony Fu&#xff0c;是 Vue 的 Core Team 的一员&#xff0c;在 Vue主要负责 vue/composition-api 这个项目的维护。这是一个面向 Vue 2 的插件&#xff0c;它在 Vue 2 中增加了 Vue 3 的 Composition API 的支持。最近也加入了 Vite…

matlab系统稳定性分析,控制系统稳定性分析的MATLAB实现

收稿日期 :200706220 基金项目 :周口师范学院青年基金资助项目(No. ZKNUQN200621) 作者简介 :刘  伟(1976 - ) ,女 ,河南太康人 ,助教 ,硕士 ,主要从事电力系统及其自动化仿真研究. 第 25 卷 第 2 期 周口师范学院学报 2008 年 3 月 Vol. 25 No. 2 Journal of Zhoukou Normal …

路由器下一跳地址怎么判断_网络基本功三:细说路由器

介绍以太网交换机工作在第二层即数据链路层&#xff0c;用于在同一网络内部转发以太网帧。但是&#xff0c;当源和目的IP地址位于不同网络时&#xff0c;以太网帧必须发送给路由器。路由器负责在不同网络间传输报文&#xff0c;通过路由表来决定最佳转发路径。当主机将报文发送…

HTML多选mysql,html多选下拉框 | 学步园

一个jquery ui,实现html的多选下拉框&#xff0c;在下拉里面加checkbox&#xff0c;不改变页面的提交特性&#xff0c;只是动态的改变select选中的多选数据。jsp页面例子&#xff1a;pageEncoding"UTF-8" import"java.util.*,java.text.*"%>String path…

利用逆矩阵解线性方程组_经典Jacobi方法用于求解矩阵特征值

1、引言求解线性方程组在许多领域中都有重要应用&#xff0c;写成矩阵的形式&#xff1a; 。求解 可以写成&#xff1a; &#xff0c;这里需要求解矩阵 的逆。《线性代数》中给出的方法主要有两类&#xff1a;1、设置增广矩阵&#xff0c;利用高斯消元法&#xff0c;通过初等行…

filename: core/loader.php,使用第三方包后出现的这个错误,你们都遇到过吗?

使用了一些第三方包&#xff0c;经常会发现&#xff0c;引入某些第三方包后(比如在laravel5.6中引入viacreative/sudo-su)&#xff0c;使用命令行工具会遇到这样的错误提示&#xff0c;卸载了第三方包后重新安装vendor目录问题立马解决。真是把人头发都愁白了&#xff1a;PHP F…

python函数的作用域_python学习第五篇 函数 变量作用域

原博文 2019-07-18 23:40 − 函数 函数是组合好的&#xff0c;可以重复使用的&#xff0c;用来实现单一或相关联功能的代码片段作用 能提高应用的模块性和代码的重复利用率函数的创建 第一函数的规则 1.函数代码块一def关键字开头&#xff0c;后接函数标识符名称和圆括号‘&…

js post中文乱码 php,AJAX之POST数据中文乱码如何解决

本文主要和大家分享AJAX之POST数据中文乱码如何解决&#xff0c;前端使用encodeURI进行编码&#xff0c;希望能帮助到大家。var param encodeURI(param);$.ajax({url: url,methodtype: "POST",async: false,timeout: 60000,contentType: "application/json&quo…

python递归 数字全排列_利用递归实现全排列(python)

利用递归实现全排列(python) """ 利用递归实现全排列 第一个位置可能有n种可能&#xff0c;第二个位置可能 有n-1种可能...... 代码思路就是第一个位置可以和n个元素交换&#xff0c; 第二个元素可以和n-1个元素进行交换&#xff0c;到最 后一个输出这次排列&am…

python pip使用_Python——pip的安装与使用

pip 是 Python 包管理工具&#xff0c;该工具提供了对Python 包的查找、下载、安装、卸载的功能。目前如果你在 python.org 下载最新版本的安装包&#xff0c;则是已经自带了该工具。Python 2.7.9 或 Python 3.4 以上版本都自带 pip 工具。pip 官网&#xff1a;https://pypi.o…

php文章列表样式,PHPCMS V9 文章列表循环样式自定义方法

在此&#xff0c;再次分享Whidy的文章"phpcms文章列表循环不同样式制作方法"&#xff0c;下面CMSYOU来与大家具体分享&#xff0c;原地址为http://whidy.net/phpcms-list-with-different-style.html&#xff0c;在这里感谢。大家在用PHPCMS系统做网站的时候,有时候在…

角速度求积分能得到欧拉角吗_一个有趣的反常积分问题

今天物理考试&#xff0c;老师提到了一个有趣的积分问题。听说是拉普拉斯变换的一个应用之一&#xff08;生成函数&#xff1f;&#xff09;&#xff0c;但是我没听过那个东西所以硬上了&#xff1a;D1&#xff09;试求积分 2) 试说明积分 的收敛性1&#xff09;对于第一问可以…

php计算1-100奇数的和,学习脚本1:计算100以内奇数和和偶数和 (笔记)

let I$[$I1]let I1let I 注意此处只有是原先数值加1才可用此方法上述三者运算是相同的- 减等 两边的变量前边的减去后边的变量之后把值再放到原来的变量上 加等 两的的变量前边的加上后边的变量之后把值再放到原来的变量上* 乘等 两边的变量前边的乘上后边的变量之后把值再放到…

查看ie保存的表单_解决浏览器保存密码自动填充问题

解决浏览器保存密码自动填充问题问题描述话说有一天&#xff0c;我如往常一样打开我的开发网站进行登录操作。浏览器很平常的在我们进行登录操作之后询问我是否需要记住密码&#xff0c;懒惰如我点击了记住密码。一切都很正常的进行着&#xff0c;没有什么异常发生。然而&#…

java满江红1apk,满江红满V版游戏下载_满江红满V版安卓版游戏下载v1.0_3DM手游

喜欢玩精彩的传奇游戏吗&#xff1f;那就来《满江红满V版》这款佳作中吧&#xff01;这款手游操作方式极其的简单&#xff0c;且玩法自由度也很高&#xff0c;咱们将会置身于一座很精美热血的魔幻大陆中&#xff0c;各种大伙熟悉的人物职业可供收集培养&#xff0c;极致精彩的P…

go get 的不再src目录中_GO语言基础进阶教程:包的使用

Go语言使用包&#xff08;package&#xff09;这种语法元素来组织源码&#xff0c;所有语法可见性均定义在package这个级别&#xff0c;与Java 、python等语言相比&#xff0c;这算不上什么创新&#xff0c;但与C传统的include相比&#xff0c;则是显得“先进”了许多。myblog …

python mysql 正则表达式,MySQL之正则表达式(REGEXP)

MySQL中正则表达式通常被用来检索或替换符合某个模式的文本内容&#xff0c;根据指定的匹配模式匹配文中符合要求的特殊字符串。例如&#xff0c;从一个文件中提取电话号码&#xff0c;查找一篇文章中重复的单词或替换用户输入的敏感语汇等&#xff0c;这些地方都可以使用正则表…

pyecharts anaconda_Pyecharts安装使用和绘图案例

一次偶然的机会&#xff0c;接触了pyecharts&#xff0c;发现做图交互效果非常棒&#xff0c;便深究、摸索、入坑。这篇文章主要讲述自己在安装和使用中遇到的问题&#xff0c;解决方法&#xff0c;最后还会有pyecharts中自己比较喜欢的绘图功能。pyecharts是一款将python与ech…