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

來源:互聯網
上載者:User
本篇文章介紹了關於PHP5.5 ~ PHP7.2 新特性整理,有需要的朋友可以參考一下

從PHP 5.5.x 移植到 PHP 5.6.x

新特性

使用運算式定義常量

  • 在之前的 PHP 版本中, 必須使用靜態值來定義常量,聲明屬性以及指定函數參數預設值。 現在你可以使用包括數值、字串字面量以及其他常量在內的數值運算式來 定義常量、聲明屬性以及設定函數參數預設值。

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

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

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

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

<?phpfunction 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中,這被稱為串連運算子。

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

<?phpnamespace 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();}?>

以上常式會輸出:

42Name\Space\f

使用 hash_equals() 比較字串避免時序攻擊

從PHP 5.6.x 移植到 PHP 7.0.x

新特性

標量型別宣告

  • 標量型別宣告 有兩種模式: 強制 (預設) 和 strict 模式。 現在可以使用下列型別參數(無論用強制模式還是strict 模式): 字串(string), 整數 (int), 浮點數 (float), 以及布爾值 (bool)。

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

以上常式會輸出:

int(9)

傳回值型別宣告

  • PHP 7 增加了對傳回型別聲明的支援。 類似於參數型別宣告,傳回型別聲明指明了函數傳回值的類型。可用的類型與參數聲明中可用的類型相同。

<?phpfunction 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時它分別返回-1、0或1。 比較的原則是沿用 PHP 的常規比較規則進行的。

<?php// 整數echo 1 <=> '1'; // 0echo 1 <=> 2; // -1echo 2 <=> 1; // 1// 浮點數echo '1.50' <=> 1.5; // 0echo 1.5 <=> 2.5; // -1echo 2.5 <=> 1.5; // 1 // 字串echo "a" <=> "a"; // 0echo "a" <=> "b"; // -1echo "b" <=> "a"; // 1?>

通過 define() 定義常量數組

  • Array 類型的常量現在可以通過 define() 來定義。在 PHP5.6 中僅能通過 const 定義。

define('ANIMALS', [    'dog',    'cat',    'bird']);echo ANIMALS[1]; // 輸出 "cat"

Closure::call()

  • Closure::call() 現在有著更好的效能,簡短幹練的暫時綁定一個方法到對象上閉包並調用它。

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

<?phpfunction 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"NULLstring(10) "elePHPant"NULLUncaught Error: Too few arguments to function test(), 0 passed in...

Void 函數

  • 一個新的傳回值類型void被引入。 傳回值聲明為 void 類型的方法要麼乾脆省去 return 語句,要麼使用一個空的 return 語句。 對於 void 函數來說,NULL 不是一個合法的傳回值。

<?phpfunction 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);

以上常式會輸出:

nullint(2)int(1)

Symmetric array destructuring

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

<?php$data = [    [1, 'Tom'],    [2, 'Fred'],];// list() stylelist($id1, $name1) = $data[0];// [] style[$id1, $name1] = $data[0];// list() styleforeach ($data as list($id, $name)) {    // logic here with $id and $name}// [] styleforeach ($data as [$id, $name]) {    // logic here with $id and $name}

類常量可見度

  • 現在起支援設定類常量的可見度。

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

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

多異常捕獲處理

  • 一個catch語句塊現在可以通過管道字元(|)來實現多個異常的捕獲。 這對於需要同時處理來自不同類的不同異常時很有用。

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

list()現在支援鍵名

  • 現在list()和它的新的[]文法支援在它內部去指定鍵名。這意味著它可以將任意類型的數組 都賦值給一些變數(與短數組文法類似)

<?php$data = [    ["id" => 1, "name" => 'Tom'],    ["id" => 2, "name" => 'Fred'],];// list() stylelist("id" => $id1, "name" => $name1) = $data[0];// [] style["id" => $id1, "name" => $name1] = $data[0];// list() styleforeach ($data as list("id" => $id, "name" => $name)) {    // logic here with $id and $name}// [] styleforeach ($data as ["id" => $id, "name" => $name]) {    // logic here with $id and $name}

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

新特性

新的物件類型

  • 這種新的物件類型, object, 引進了可用於逆變(contravariant)參數輸入和協變(covariant)返回任何物件類型。

<?phpfunction 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,};
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.