搜尋
首頁後端開發PHP7整理PHP5.5 ~ PHP7.2 新特性

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

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

一、從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 = &#39;The value of THREE is &#39;.self::THREE;
}

現在可以透過 const 關鍵字來定義類型為 array 的常數。

<?php const ARR = [&#39;a&#39;, &#39;b&#39;];

echo ARR[0];

使用... 運算子定義變長參數函數

現在可以不依賴func_get_args(), 使用... 運算符來實現變長參數函數。

<?php function f($req, $opt = null, ...$params) {
    // $params 是一个包含了剩余参数的数组
    printf(&#39;$req: %d; $opt: %d; number of params: %d&#39;."\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() 比較字串避免時序攻擊

推薦(免費): PHP7


二、從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, &#39;3&#39;, 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[&#39;user&#39;] and returns &#39;nobody&#39; if it does not exist.
$username = $_GET[&#39;user&#39;] ?? &#39;nobody&#39;;
// This is equivalent to:
$username = isset($_GET[&#39;user&#39;]) ? $_GET[&#39;user&#39;] : &#39;nobody&#39;;

// Coalesces can be chained: this will return the first defined value out of $_GET[&#39;user&#39;], $_POST[&#39;user&#39;], and &#39;nobody&#39;.
$username = $_GET[&#39;user&#39;] ?? $_POST[&#39;user&#39;] ?? &#39;nobody&#39;;
?>

太空船運算子(組合比較子)

太空船運算子用於比較兩個表達式。當$a小於、等於或大於$b時它分別回傳-1、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() 方法來取得生成器的回傳值, 但是這個方法只能在生成器完成產生工作以後呼叫一次。

整數除法函數intp()


#從PHP 7.0.x 移植到PHP 7.1.x

#可為空(Nullable)類型

參數以及傳回值的型別現在可以透過在型別前加上一個問號來使之允許為空。當啟用這個特性時,傳入的參數或函數傳回的結果要不是給定的類型,就是 null 。

<?php function testReturn(): ?string
{
    return &#39;elePHPant&#39;;
}

var_dump(testReturn());

function testReturn(): ?string
{
    return null;
}

var_dump(testReturn());

function test(?string $name)
{
    var_dump($name);
}

test(&#39;elePHPant&#39;);
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)

Symmetric array destructuring

短數組語法([])現在作為list()語法的一個備選項,可以用於將數組的值賦給一些變數(包括在foreach中)。

<?php $data = [
    [1, &#39;Tom&#39;],
    [2, &#39;Fred&#39;],
];

// 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
}

从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 新特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。