摘要:它使得在生產環境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。錯誤和異常改變了大多數錯誤的報告方式。不同于傳統的錯誤報告機制,現在大多數錯誤被作為異常拋出。
PHP7性能
7最大的亮點,應該就是性能提高了兩倍,某些測試環境下甚至提高到三到五倍,具體可以了解以下鏈接:
PHP7 VS HHVM (WordPress)
HHVM vs PHP 7 – The Competition Gets Closer!
PHP 7.0 Is Showing Very Promising Performance Over PHP 5, Closing Gap With HHVM
PHP7革新與性能優化
常用特性整理 標量類型聲明PHP 7 中的函數的形參類型聲明可以是標量了。在 PHP 5 中只能是類名、接口、array 或者 callable (PHP 5.4,即可以是函數,包括匿名函數),現在也可以使用 string、int、float和 bool 了。
強制模式(默認,既強制類型轉換)下會對不符合預期的參數進行強制類型轉換,但嚴格模式下則觸發 TypeError 的致命錯誤。返回值類型聲明
嚴格模式:申明 declare(strict_types=1)即可;PHP 7 增加了對返回類型聲明的支持。 類似于參數類型聲明,返回類型聲明指明了函數返回值的類型。可用的類型與參數聲明中可用的類型相同。
function arraysSum(array ...$arrays): array { # 把返回值強制轉換為string return array_map(function(array $array): string { return array_sum($array); }, $arrays); } var_dump(arraysSum([1,2,3], [4,5,6], [7,8,9])); # output array(3) { [0]=> string(1) "6" [1]=> string(2) "15" [2]=> string(2) "24" } // 7.1 要么string,要么是null function testReturn(): ?string { return null; } // 7.1 要么沒有return,要么使用空的return。 // 對于 void來說,NULL 不是一個合法的返回值。雖然它返回的也是個null 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); // 7.1 返回對象類型 function test(object $obj) : object { return new SplQueue(); } // 7.1 // iterable: 數組或者實現Traversable接口的對象 // Traversable也就是 IteratorAggregate 或 Iterator 接口實現。 // 也就是函數必須要傳入一個可foreach遍歷的參數,以及返回一個可foreach遍歷的值 function iterator(iterable $iter) : iterable { foreach ($iter as $val) { // } }同樣有嚴格模式和強制模式允許重寫抽象方法(Abstract method)abstract class A { abstract function test(string $s); } abstract class B extends A { // 當一個抽象類繼承于另外一個抽象類的時候,繼承后的抽象類可以重寫被繼承的抽象類的抽象方法。 abstract function test($s) : int; }運算符...5.6就有此特性了,但在PHP7的的程序代碼中才發現大量使用
使用...運算符定義變長參數函數
function f($req, $opt = null, ...$params) { // $params 是一個包含了剩余參數的數組 printf("$req: %d; $opt: %d; number of params: %d"." ", $req, $opt, count($params)); } f(1); f(1, 2); f(1, 2, 3); f(1, 2, 3, 4); # output $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使用...運算符進行參數展開
function add($a, $b, $c) { return $a + $b + $c; } $operators = [2, 3]; echo add(1, ...$operators); // output: 6NULL 合并運算符// 如果 $_GET["user"] 不存在返回 "nobody",否則返回 $_GET["user"] 的值 $username = $_GET["user"] ?? "nobody"; // 相當于 isset($_GET["user"]) ? $_GET["user"] : "nobody"; // 類似于屏蔽notice錯誤后的: $username = $_GET["user"] ?: "nobody";太空船操作符(組合比較符)用于比較兩個表達式。當$a大于、等于或小于$b時它分別返回-1、0或1。
1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1 // 浮點型 echo 1.5 <=> 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() 定義常量數組匿名類現在支持通過new class 來實例化一個匿名類
interface Logger { public function log(string $msg); } class Application { private $logger; public function getLogger(): Logger { return $this->logger; } public function setLogger(Logger $logger) { $this->logger = $logger; } } $app = new Application; $app->setLogger(new class implements Logger { public function log(string $msg) { echo $msg; } }); var_dump($app->getLogger()); # output: object(class@anonymous)#2 (0) { }為unserialize()提供過濾這個特性旨在提供更安全的方式解包不可靠的數據。它通過白名單的方式來防止潛在的代碼注入。
// 轉換對象為 __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]);斷言assert向后兼用并增強之前的 assert() 的方法。 它使得在生產環境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。
ini_set("assert.exception", 1); class CustomError extends AssertionError {} assert(2 == 1, new CustomError("Some error message"));use 加強從同一 namespace 導入的類、函數和常量現在可以通過單個 use 語句 一次性導入了。
// PHP 7 之前版本用法 use some amespaceClassA; use some amespaceClassB; use some amespaceClassC as C; use function some amespacefn_a; use function some amespacefn_b; use function some amespacefn_c; use const some amespaceConstA; use const some amespaceConstB; use const some amespaceConstC; // PHP 7+ 用法 use some amespace{ClassA, ClassB, ClassC as C}; use function some amespace{fn_a, fn_b, fn_c}; use const some amespace{ConstA, ConstB, ConstC};Generator 加強 : yield from增強了Generator的功能,這個可以實現很多先進的特性
function gen() { yield 1; yield 2; yield from gen2(); } function gen2() { yield 3; yield 4; } foreach (gen() as $val) { echo $val, PHP_EOL; }整除新增了整除函數 intdiv()
var_dump(intdiv(10, 3)); # 3array_column() 和 list()新增支持對象數組
list($a, $b) = (object) new ArrayObject([0, 1]); // PHP7結果:$a == 0 and $b == 1. // PHP5結果:$a == null and $b == null. // 短數組語法([])現在作為list()語法的一個備選項 $data = [ [1, "Tom"], [2, "Fred"], ]; // list() style list($id1, $name1) = $data[0]; // [] style [$id1, $name1] = $data[0]; # $id1 : 1 // 7.1還支持鍵名 ["id" => $id1, "name" => $name1] = $data[0];dirname()增加了可選項$levels,可以用來指定目錄的層級。dirname(dirname($foo)) => dirname($foo, 2);
Closure::call()Closure::call() 現在有著更好的性能,簡短干練的暫時綁定一個方法到對象上閉包并調用它。
class A {private $x = 1;} // Pre 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);類常量可見性支持設置類常量的可見性。
錯誤和異常PHP 7 改變了大多數錯誤的報告方式。不同于傳統(PHP 5)的錯誤報告機制,現在大多數錯誤被作為Error異常拋出。
Throwable 錯誤和異常的頂級類
Error 錯誤
Exception 異常
// 7.1 多異常捕獲 try { // some code } catch (FirstException | SecondException $e) { // handle first and second exceptions } try { throw new Error("message"); // throw new Exception("message"); } // 捕獲所有的異常和錯誤 catch (Throwable $t) { echo "Throwable: " . $t->getMessage(); } // 只捕獲錯誤 catch (Error $e) { echo "Error : " . $e->getMessage(); } // 只捕獲異常 catch (Exception $e) { echo "Exception : " . $e->getMessage(); }異步信號處理//開啟異步信號處理 pcntl_async_signals(true); // SIGINT信號也就是ctrl+c,當ctrl+c的時候觸發此回調 pcntl_signal(SIGINT, function(){ echo "捕獲到SIGINT信號" . PHP_EOL; }); $i = 0; while(1) { echo $i++ . PHP_EOL; sleep(1); }更多請參考:
關于PHP7新特性
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31357.html
摘要:可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。會檢查指定的并在結果為時采取適當的行動視而定。中的斷言向后兼用并增強之前的的方法。它使得在生產環境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。 簡述 編寫代碼時,我們總是會做出一些假設,斷言就是用于在代碼中捕捉這些假設,可以將斷言看作是異常處理的一種高級形式。程序員斷言在程序中的某個特定點該...
摘要:復制當前閉包對象,綁定指定的對象和類作用域。類作用域,可以是對象,也可以是實例名稱什么是匿名類先理解以下三個例子例閉包函數都是繼承類返回匿名函數返回匿名函數,也就是閉包函數,所有閉包函數都是繼承類輸出例將一個匿名函數綁定到一個類中。 類結構 Closure { /* 方法 */ // 用于禁止實例化的構造函數 __construct ( void ) ...
摘要:通過生成器來生成關聯數組下面每一行是用分號分割的字段組合,第一個字段將被用作鍵名。正常來說,產生的是一個,它的成員變量與函數不存在別名引用關系。關鍵字在的版本,生成器允許從其他生成器,可迭代對象或數組通過關鍵字來生成對應的值輸出 一般你在迭代一組數據的時候,需要創建一個數據,假設數組很大,則會消耗很大性能,甚至造成內存不足。 //Fatal error: Allowed memory ...
摘要:磁盤高速緩存操作系統中使用磁盤高速緩存技術來提高磁盤的速度,對高速緩存復制的訪問要比原始數據訪問更為高效。因此,磁盤高速緩存在邏輯上屬于磁盤,物理上則是駐留在內存中的盤塊。 1. 磁盤高速緩存(Disk Cache) 操作系統中使用磁盤高速緩存技術來提高磁盤的I/O速度,對高速緩存復制的訪問要比原始數據訪問更為高效。例如,正在運行的進程的指令既存儲在磁盤上,也存儲在物理內存上,也被復...
摘要:而依賴倒置原則的思想是,上層不應該依賴下層,應依賴接口。上面通過構造函數注入對象的方式,就是最簡單的依賴注入當然注入不僅可以通過構造函數注入,也可以通過屬性注入,上面你可以通過一個來動態為這個屬性賦值。 依賴倒置和控制反轉是一種編程思想,而依賴注入就是通過服務容器實現這種面向接口或者是面向抽象編程的思想 概念理解 依賴倒置原則 依賴倒置是一種軟件設計思想,在傳統軟件中,上層代碼依賴于下...
閱讀 1106·2021-11-23 09:51
閱讀 1073·2021-10-18 13:31
閱讀 2965·2021-09-22 16:06
閱讀 4255·2021-09-10 11:19
閱讀 2195·2019-08-29 17:04
閱讀 424·2019-08-29 10:55
閱讀 2471·2019-08-26 16:37
閱讀 3368·2019-08-26 13:29