PHP 7 新增加的特性

來源:互聯網
上載者:User
這篇文章主要介紹了關於PHP 7 新增加的特性 ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一

標量型別宣告

PHP 7 中的函數的形參型別宣告可以是標量了。在 PHP 5 中只能是類名、介面、array 或者 callable (PHP5.4,即可以是函數,包括匿名函數),現在也可以使用 string、int、float和 bool 了。

<?php// 強制模式function sumOfInts(int...$ints){    return array_sum($ints);} var_dump(sumOfInts(2,'3',4.1));

以上執行個體會輸出:

int(9)

需要注意的是上文提到的strict 模式的問題在這裡同樣適用:強制模式(預設,既強制類型轉換)下還是會對不符合預期的參數進行強制類型轉換,strict 模式下則觸發 TypeError 的致命錯誤。

傳回值型別宣告

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

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

以上執行個體會輸出:

Array(    [0]=>6    [1]=>15    [2]=>24)

NULL 合并運算子

由於日常使用中存在大量同時使用三元運算式和 isset()的情況,NULL 合并運算子使得變數存在且值不為NULL,它就會返回自身的值,否則返回它的第二個運算元。

執行個體如下:

<?php// 如果 $_GET['user'] 不存在返回 'nobody',否則返回 $_GET['user'] 的值$username = $_GET['user']??'nobody';// 類似的三元運算子$username = isset($_GET['user'])? $_GET['user']:'nobody';?>

太空船操作符(組合比較符)

太空船操作符用於比較兩個運算式。當$a大於、等於或小於$b時它分別返回-1、0或1。

執行個體如下:

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

通過 define() 定義常量數組

執行個體如下:

<?phpdefine('ANIMALS',[    'dog',    'cat',    'bird']); echo ANIMALS[1];// 輸出 "cat"?>

匿名類

現在支援通過new class 來執行個體化一個匿名類,執行個體如下:

<?phpinterfaceLogger{    publicfunction log(string $msg);} classApplication{    private $logger;     publicfunction getLogger():Logger{         return $this->logger;    }     publicfunction setLogger(Logger $logger){         $this->logger = $logger;    }} $app =newApplication;$app->setLogger(newclassimplementsLogger{    publicfunction log(string $msg){        echo $msg;    }}); var_dump($app->getLogger());?>

以上執行個體會輸出:

object(class@anonymous)#2(0){}

Unicode codepoint 轉譯文法

這接受一個以16進位形式的 Unicodecodepoint,並列印出一個雙引號或heredoc包圍的 UTF-8 編碼格式的字串。可以接受任何有效 codepoint,並且開頭的 0 是可以省略的。

echo "\u{aa}";echo "\u{0000aa}";echo "\u{9999}";

以上執行個體會輸出:

ªª(same as before but with optional leading 0's)

Closure::call()

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

<?phpclass A {private $x =1;} // Pre PHP7 代碼$getXCB =function(){return $this->x;};$getX = $getXCB->bindTo(new A,'A');// intermediate closureecho $getX(); // PHP 7+ 代碼$getX =function(){return $this->x;};echo $getX->call(new A);

以上執行個體會輸出:

11

為unserialize()提供過濾

這個特性旨在提供更安全的方式解包不可靠的資料。它通過白名單的方式來防止潛在的代碼注入。

<?php // 轉換對象為 __PHP_Incomplete_Class 對象$data = unserialize($foo,["allowed_classes"=>false]); // 轉換對象為 __PHP_Incomplete_Class 對象,除了 MyClass 和 MyClass2$data = unserialize($foo,["allowed_classes"=>["MyClass","MyClass2"]); // 預設接受所有類$data = unserialize($foo,["allowed_classes"=>true]);

IntlChar

新增加的 IntlChar 類旨在暴露出更多的 ICU 功能。這個類自身定義了許多靜態方法用於操作多字元集的 unicode 字元。

<?phpprintf('%x',IntlChar::CODEPOINT_MAX);echo IntlChar::charName('@');var_dump(IntlChar::ispunct('!'));

以上執行個體會輸出:

10ffffCOMMERCIAL ATbool(true)

若要使用此類,請先安裝Intl擴充

預期

預期是向後兼用並增強之前的 assert() 的方法。它使得在生產環境中啟用斷言為零成本,並且提供當宣告失敗時拋出特定異常的能力。

<?phpini_set('assert.exception',1); classCustomErrorextendsAssertionError{} assert(false,newCustomError('Someerror message'));?>

以上執行個體會輸出:

Fatalerror:Uncaught CustomError:Some error message

use 加強

從同一 namespace 匯入的類、函數和常量現在可以通過單個 use 語句一次性匯入了。

<?php //  PHP 7 之前版本用法use some\namespace\ClassA;use some\namespace\ClassB;use some\namespace\ClassC as C; usefunction some\namespace\fn_a;usefunction some\namespace\fn_b;usefunction some\namespace\fn_c; useconst some\namespace\ConstA;useconst some\namespace\ConstB;useconst some\namespace\ConstC; // PHP 7+ 用法use some\namespace\{ClassA,ClassB,ClassCas C};usefunction some\namespace\{fn_a, fn_b, fn_c};useconst some\namespace\{ConstA,ConstB,ConstC};?>

Generator 加強

增強了Generator的功能,這個可以實現很多先進的特性

<?php<?php function gen(){    yield1;    yield2;     yieldfrom gen2();} function gen2(){    yield3;    yield4;} foreach(gen()as $val){    echo $val, PHP_EOL;} ?>

以上執行個體會輸出:

1234

整除

新增了整除函數 intp(),使用執行個體:

<?phpvar_dump(intp(10,3));?>

以上執行個體會輸出:

int(3)

相關推薦:

php 5.4中新增加對session狀態判斷的功能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.