摘要:它使得在生產(chǎn)環(huán)境中啟用斷言為零成本,并且提供當(dāng)斷言失敗時(shí)拋出特定異常的能力。錯(cuò)誤和異常改變了大多數(shù)錯(cuò)誤的報(bào)告方式。不同于傳統(tǒng)的錯(cuò)誤報(bào)告機(jī)制,現(xiàn)在大多數(shù)錯(cuò)誤被作為異常拋出。
PHP7性能
7最大的亮點(diǎn),應(yīng)該就是性能提高了兩倍,某些測試環(huán)境下甚至提高到三到五倍,具體可以了解以下鏈接:
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革新與性能優(yōu)化
常用特性整理 標(biāo)量類型聲明PHP 7 中的函數(shù)的形參類型聲明可以是標(biāo)量了。在 PHP 5 中只能是類名、接口、array 或者 callable (PHP 5.4,即可以是函數(shù),包括匿名函數(shù)),現(xiàn)在也可以使用 string、int、float和 bool 了。
強(qiáng)制模式(默認(rèn),既強(qiáng)制類型轉(zhuǎn)換)下會(huì)對(duì)不符合預(yù)期的參數(shù)進(jìn)行強(qiáng)制類型轉(zhuǎn)換,但嚴(yán)格模式下則觸發(fā) TypeError 的致命錯(cuò)誤。返回值類型聲明
嚴(yán)格模式:申明 declare(strict_types=1)即可;PHP 7 增加了對(duì)返回類型聲明的支持。 類似于參數(shù)類型聲明,返回類型聲明指明了函數(shù)返回值的類型。可用的類型與參數(shù)聲明中可用的類型相同。
function arraysSum(array ...$arrays): array { # 把返回值強(qiáng)制轉(zhuǎn)換為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。 // 對(duì)于 void來說,NULL 不是一個(gè)合法的返回值。雖然它返回的也是個(gè)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 返回對(duì)象類型 function test(object $obj) : object { return new SplQueue(); } // 7.1 // iterable: 數(shù)組或者實(shí)現(xiàn)Traversable接口的對(duì)象 // Traversable也就是 IteratorAggregate 或 Iterator 接口實(shí)現(xiàn)。 // 也就是函數(shù)必須要傳入一個(gè)可foreach遍歷的參數(shù),以及返回一個(gè)可foreach遍歷的值 function iterator(iterable $iter) : iterable { foreach ($iter as $val) { // } }同樣有嚴(yán)格模式和強(qiáng)制模式允許重寫抽象方法(Abstract method)abstract class A { abstract function test(string $s); } abstract class B extends A { // 當(dāng)一個(gè)抽象類繼承于另外一個(gè)抽象類的時(shí)候,繼承后的抽象類可以重寫被繼承的抽象類的抽象方法。 abstract function test($s) : int; }運(yùn)算符...5.6就有此特性了,但在PHP7的的程序代碼中才發(fā)現(xiàn)大量使用
使用...運(yùn)算符定義變長參數(shù)函數(shù)
function f($req, $opt = null, ...$params) { // $params 是一個(gè)包含了剩余參數(shù)的數(shù)組 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使用...運(yùn)算符進(jìn)行參數(shù)展開
function add($a, $b, $c) { return $a + $b + $c; } $operators = [2, 3]; echo add(1, ...$operators); // output: 6NULL 合并運(yùn)算符// 如果 $_GET["user"] 不存在返回 "nobody",否則返回 $_GET["user"] 的值 $username = $_GET["user"] ?? "nobody"; // 相當(dāng)于 isset($_GET["user"]) ? $_GET["user"] : "nobody"; // 類似于屏蔽notice錯(cuò)誤后的: $username = $_GET["user"] ?: "nobody";太空船操作符(組合比較符)用于比較兩個(gè)表達(dá)式。當(dāng)$a大于、等于或小于$b時(shí)它分別返回-1、0或1。
1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1 // 浮點(diǎn)型 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() 定義常量數(shù)組匿名類現(xiàn)在支持通過new class 來實(shí)例化一個(gè)匿名類
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()提供過濾這個(gè)特性旨在提供更安全的方式解包不可靠的數(shù)據(jù)。它通過白名單的方式來防止?jié)撛诘拇a注入。
// 轉(zhuǎn)換對(duì)象為 __PHP_Incomplete_Class 對(duì)象 $data = unserialize($foo, ["allowed_classes" => false]); // 轉(zhuǎn)換對(duì)象為 __PHP_Incomplete_Class 對(duì)象,除了 MyClass 和 MyClass2 $data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]]); // 默認(rèn)接受所有類 $data = unserialize($foo, ["allowed_classes" => true]);斷言assert向后兼用并增強(qiáng)之前的 assert() 的方法。 它使得在生產(chǎn)環(huán)境中啟用斷言為零成本,并且提供當(dāng)斷言失敗時(shí)拋出特定異常的能力。
ini_set("assert.exception", 1); class CustomError extends AssertionError {} assert(2 == 1, new CustomError("Some error message"));use 加強(qiáng)從同一 namespace 導(dǎo)入的類、函數(shù)和常量現(xiàn)在可以通過單個(gè) use 語句 一次性導(dǎo)入了。
// 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 加強(qiáng) : yield from增強(qiáng)了Generator的功能,這個(gè)可以實(shí)現(xiàn)很多先進(jìn)的特性
function gen() { yield 1; yield 2; yield from gen2(); } function gen2() { yield 3; yield 4; } foreach (gen() as $val) { echo $val, PHP_EOL; }整除新增了整除函數(shù) intdiv()
var_dump(intdiv(10, 3)); # 3array_column() 和 list()新增支持對(duì)象數(shù)組
list($a, $b) = (object) new ArrayObject([0, 1]); // PHP7結(jié)果:$a == 0 and $b == 1. // PHP5結(jié)果:$a == null and $b == null. // 短數(shù)組語法([])現(xiàn)在作為list()語法的一個(gè)備選項(xiàng) $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()增加了可選項(xiàng)$levels,可以用來指定目錄的層級(jí)。dirname(dirname($foo)) => dirname($foo, 2);
Closure::call()Closure::call() 現(xiàn)在有著更好的性能,簡短干練的暫時(shí)綁定一個(gè)方法到對(duì)象上閉包并調(diào)用它。
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);類常量可見性支持設(shè)置類常量的可見性。
錯(cuò)誤和異常PHP 7 改變了大多數(shù)錯(cuò)誤的報(bào)告方式。不同于傳統(tǒng)(PHP 5)的錯(cuò)誤報(bào)告機(jī)制,現(xiàn)在大多數(shù)錯(cuò)誤被作為Error異常拋出。
Throwable 錯(cuò)誤和異常的頂級(jí)類
Error 錯(cuò)誤
Exception 異常
// 7.1 多異常捕獲 try { // some code } catch (FirstException | SecondException $e) { // handle first and second exceptions } try { throw new Error("message"); // throw new Exception("message"); } // 捕獲所有的異常和錯(cuò)誤 catch (Throwable $t) { echo "Throwable: " . $t->getMessage(); } // 只捕獲錯(cuò)誤 catch (Error $e) { echo "Error : " . $e->getMessage(); } // 只捕獲異常 catch (Exception $e) { echo "Exception : " . $e->getMessage(); }異步信號(hào)處理//開啟異步信號(hào)處理 pcntl_async_signals(true); // SIGINT信號(hào)也就是ctrl+c,當(dāng)ctrl+c的時(shí)候觸發(fā)此回調(diào) pcntl_signal(SIGINT, function(){ echo "捕獲到SIGINT信號(hào)" . PHP_EOL; }); $i = 0; while(1) { echo $i++ . PHP_EOL; sleep(1); }更多請參考:
關(guān)于PHP7新特性
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31357.html
摘要:可以在任何時(shí)候啟用和禁用斷言驗(yàn)證,因此可以在測試時(shí)啟用斷言,而在部署時(shí)禁用斷言。會(huì)檢查指定的并在結(jié)果為時(shí)采取適當(dāng)?shù)男袆?dòng)視而定。中的斷言向后兼用并增強(qiáng)之前的的方法。它使得在生產(chǎn)環(huán)境中啟用斷言為零成本,并且提供當(dāng)斷言失敗時(shí)拋出特定異常的能力。 簡述 編寫代碼時(shí),我們總是會(huì)做出一些假設(shè),斷言就是用于在代碼中捕捉這些假設(shè),可以將斷言看作是異常處理的一種高級(jí)形式。程序員斷言在程序中的某個(gè)特定點(diǎn)該...
摘要:復(fù)制當(dāng)前閉包對(duì)象,綁定指定的對(duì)象和類作用域。類作用域,可以是對(duì)象,也可以是實(shí)例名稱什么是匿名類先理解以下三個(gè)例子例閉包函數(shù)都是繼承類返回匿名函數(shù)返回匿名函數(shù),也就是閉包函數(shù),所有閉包函數(shù)都是繼承類輸出例將一個(gè)匿名函數(shù)綁定到一個(gè)類中。 類結(jié)構(gòu) Closure { /* 方法 */ // 用于禁止實(shí)例化的構(gòu)造函數(shù) __construct ( void ) ...
摘要:通過生成器來生成關(guān)聯(lián)數(shù)組下面每一行是用分號(hào)分割的字段組合,第一個(gè)字段將被用作鍵名。正常來說,產(chǎn)生的是一個(gè),它的成員變量與函數(shù)不存在別名引用關(guān)系。關(guān)鍵字在的版本,生成器允許從其他生成器,可迭代對(duì)象或數(shù)組通過關(guān)鍵字來生成對(duì)應(yīng)的值輸出 一般你在迭代一組數(shù)據(jù)的時(shí)候,需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù),假設(shè)數(shù)組很大,則會(huì)消耗很大性能,甚至造成內(nèi)存不足。 //Fatal error: Allowed memory ...
摘要:磁盤高速緩存操作系統(tǒng)中使用磁盤高速緩存技術(shù)來提高磁盤的速度,對(duì)高速緩存復(fù)制的訪問要比原始數(shù)據(jù)訪問更為高效。因此,磁盤高速緩存在邏輯上屬于磁盤,物理上則是駐留在內(nèi)存中的盤塊。 1. 磁盤高速緩存(Disk Cache) 操作系統(tǒng)中使用磁盤高速緩存技術(shù)來提高磁盤的I/O速度,對(duì)高速緩存復(fù)制的訪問要比原始數(shù)據(jù)訪問更為高效。例如,正在運(yùn)行的進(jìn)程的指令既存儲(chǔ)在磁盤上,也存儲(chǔ)在物理內(nèi)存上,也被復(fù)...
摘要:而依賴倒置原則的思想是,上層不應(yīng)該依賴下層,應(yīng)依賴接口。上面通過構(gòu)造函數(shù)注入對(duì)象的方式,就是最簡單的依賴注入當(dāng)然注入不僅可以通過構(gòu)造函數(shù)注入,也可以通過屬性注入,上面你可以通過一個(gè)來動(dòng)態(tài)為這個(gè)屬性賦值。 依賴倒置和控制反轉(zhuǎn)是一種編程思想,而依賴注入就是通過服務(wù)容器實(shí)現(xiàn)這種面向接口或者是面向抽象編程的思想 概念理解 依賴倒置原則 依賴倒置是一種軟件設(shè)計(jì)思想,在傳統(tǒng)軟件中,上層代碼依賴于下...
閱讀 1118·2021-11-23 09:51
閱讀 1081·2021-10-18 13:31
閱讀 2991·2021-09-22 16:06
閱讀 4284·2021-09-10 11:19
閱讀 2206·2019-08-29 17:04
閱讀 437·2019-08-29 10:55
閱讀 2485·2019-08-26 16:37
閱讀 3381·2019-08-26 13:29