這篇文章主要介紹了關於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狀態判斷的功能