PHP5.5至PHP7.2 新特性整理-PHP7

资源魔 47 0
1、从PHP 5.5.x 移植到 PHP 5.6.x

应用表白式界说常量

正在以前的 PHP 版本中, 必需应用动态值来界说常量,申明属性和指定函数参数默许值。 如今你能够应用包罗数值、字符串字面量和其余常量正在内的数值表白式来 界说常量、申明属性和设置函数参数默许值。

<?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 的常量。

<?php
const ARR = ['a', 'b'];
echo ARR[0];

应用 ... 运算符界说变长参数函数

如今能够没有依赖 func_get_args(), 应用 ... 运算符 来完成 变长参数函数。

<?php
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中,这被称为衔接运算符。

<?php
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

<?php
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() 比拟字符串防止时序攻打

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

标量类型申明

标量类型申明 有两种模式: 强迫 (默许) 以及 严格模式。 如今能够应用下列类型参数(无论用强迫模式仍是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 和布尔值 (bool)。

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

以上例程会输入:

int(9)

前往值类型申明

PHP 7 添加了对前往类型申明的支持。 相似于参数类型申明,前往类型申明指清楚明了函数前往值的类型。可用的类型与参数申明中可用的类型相反。

<?php
function arraysSum(array ...$arrays): array
{
    return array_map(function(array $array): int {
        return array_sum($array);
    }, $arrays);
}

null兼并运算符

因为一样平常应用中存正在年夜量同时应用三元表白式以及 isset()的状况, 咱们增加了null兼并运算符 (??) 这个语法糖。假如变量存正在且值没有为NULL, 它就会前往本身的值,不然前往它的第二个操作数。

<?php
// 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时它辨别前往-一、0或1。 比拟的准则是相沿 PHP 的惯例比拟规定进行的。

<?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() 如今有着更好的功能,冗长老练的临时绑定一个办法到工具上闭包并挪用它。

<?php
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
// 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()

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

可为空(Nullable)类型

参数和前往值的类型如今能够经过正在类型前加之一个问号使之容许为空。 当启用这个特点时,传入的参数或许函数前往的后果要末是给定的类型,要末是 null 。

<?php
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 没有是一个非法的前往值。

<?php
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)
Sy妹妹etric array destructuring

短数组语法([])如今作为list()语法的一个备选项,能够用于将数组的值赋给一些变量(包罗正在foreach中)。

<?php
$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
}

类常量可见性

如今起支持设置类常量的可见性。

<?php
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。

<?php
function iterator(iterable $iter) : iterable
{
    foreach ($iter as $val) {
        //
    }
}

多异样捕捉解决

一个catch语句块如今能够经过管道字符(|)来完成多个异样的捕捉。 这关于需求同时解决来自没有同类的没有同异样时颇有用。

<?php
try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
}

list()如今支持键名

如今list()以及它的新的[]语法支持正在它外部去指定键名。这象征着它能够将恣意类型的数组 都赋值给一些变量(与短数组语法相似)

<?php
$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
}

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

新的工具类型

这类新的工具类型, object, 引进了可用于逆变(contravariant)参数输出以及协变(covariant)前往任何工具类型。

<?php
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,
};

以上就是PHP5.5至PHP7.2 新特点整顿的具体内容,更多请存眷资源魔其它相干文章!

标签: PHP7 php7开发教程 php7开发资料 php7开发自学

抱歉,评论功能暂时关闭!