php7與PHP5比較的新功能與效能最佳化
1. 抽象語法樹(AST )
AST在PHP編譯過程作為一個中間件的角色,替換原來直接從解釋器吐出opcode的方式,讓解釋器(parser)和編譯器(compliler)解耦,可以減少一些Hack程式碼,同時,讓實作更容易理解和可維護
推薦(免費):PHP7
##2. Natice TLS:
線程資料共享安全,開啟一個全域執行緒用作資料共享記憶體空間#3. 指定參數回傳值類型
4. zval 結構的變化
5. 異常處理
PHP 5 的try ... catch ... finally 無法處理傳統錯誤,如果需要,你通常會考慮用set_error_handler() 來Hack 一下。但仍有許多錯誤類型是 set_error_handler() 捕捉不到的 PHP 7引入 Throwable 接口,錯誤及異常都實現了 Throwable,無法直接實現 Throwable,但可以擴展 \Exception 和 \Error 類別。可以用 Throwable 捕捉異常跟錯誤。 \Exception 是所有PHP及使用者異常的基底類別;\Error 是所有內部PHP錯誤的基底類別。6. 新的參數解析方式
7. hashtable變化
buckets、Zvals不再單獨分配內存,消除了很多沒用的冗餘。8、空白合併運算元(Null Coalesce Operator)
#直接上範例:$name = $name ?? "NoName"; // 如果$name有值就取其值,否则设$name成"NoName"
9、飛船操作符(Spaceship Operator)(組合比較運算子)
形式:(expr) 96b4fef55684b9312718d5de63fb7121 (expr)
左邊運算物件小,則傳回- 1;左、右兩邊運算物件相等,則回傳0;左邊運算物件大,則回傳1。$name = ["Simen", "Suzy", "Cook", "Stella"]; usort($name, function ($left, $right) { return $left <=> $right; }); print_r($name);
10、常數數組(Constant Array)
PHP 7 之前只允許類別/介面中使用常數數組,現在PHP 7 也支援非類別/介面的普通常量數組了。define("USER", [ "name" => "Simen", "sex" => "Male", "age" => "38", "skill" => ["PHP", "MySQL", "C"] ]); // USER["skill"][2] = "C/C++"; // PHP Fatal error: Cannot use temporary expression in write context in...
11、統一了變數語法
$goo = [ "bar" => [ "baz" => 100, "cug" => 900 ] ]; $foo = "goo"; $$foo["bar"]["baz"]; // 实际为:($$foo)['bar']['baz']; PHP 5 中为:${$foo['bar']['baz']}; // PHP 7 中一个笼统的判定规则是,由左向右结合。
12、Throwable 介面
這是PHP 7 引進的一個值得期待的新特性,將大幅增強PHP 錯誤處理能力。 PHP 5 的 try ... catch ... finally 無法處理傳統錯誤,如果需要,你通常會考慮用 set_error_handler() 來 Hack 一下。但仍有許多錯誤類型是 set_error_handler() 捕捉不到的。 PHP 7引入 Throwable 接口,錯誤及異常都實現了 Throwable,無法直接實作 Throwable,但可以擴展 \Exception 和 \Error 類別。可以用 Throwable 捕捉異常跟錯誤。 \Exception 是所有PHP及使用者異常的基底類別;\Error 是所有內部PHP錯誤的基底類別。$name = "Tony"; try { $name = $name->method(); } catch (\Error $e) { echo "出错消息 --- ", $e->getMessage(), PHP_EOL; } try { $name = $name->method(); } catch (\Throwable $e) { echo "出错消息 --- ", $e->getMessage(), PHP_EOL; } try { intp(5, 0); } catch (\pisionByZeroError $e) { echo "出错消息 --- ", $e->getMessage(), PHP_EOL; }
13、use 組合宣告
use 組合宣告可以減少 use 的輸入冗餘。use PHPGoodTaste\Utils\{ Util, Form, Form\Validation, Form\Binding };
14、一次捕捉多種類型的異常/ 錯誤
PHP 7.1 新添加了捕獲多種異常/錯誤類型的語法——透過豎槓“ |”來實現。try { throw new LengthException("LengthException"); // throw new pisionByZeroError("pisionByZeroError"); // throw new Exception("Exception"); } catch (\pisionByZeroError | \LengthException $e) { echo "出错消息 --- ", $e->getMessage(), PHP_EOL; } catch (\Exception $e) { echo "出错消息 --- ", $e->getMessage(), PHP_EOL; } finally { // ... }
15、可見性修飾符的變化
PHP 7.1 之前的類別常數是不允許添加可見性修飾符的,此時類別常數可見性相當於public。 PHP 7.1 為類別常數添加了可見性修飾符支援特性。總的來說,可見性修飾符使用範圍如下所示:class YourClass { const THE_OLD_STYLE_CONST = "One"; public const THE_PUBLIC_CONST = "Two"; private const THE_PRIVATE_CONST = "Three"; protected const THE_PROTECTED_CONST = "Four"; }
iterable 偽類型
PHP 7.1 引進了iterable 偽類型。 iterable 類型適用於數組、生成器以及實作了 Traversable 的對象,它是 PHP 中保留類別名稱。$fn = function (iterable $it) : iterable { $result = []; foreach ($it as $value) { $result[] = $value + 1000; } return $result; }; $fn([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
可空型別(Nullable Type)
PHP 7.1 引進了可空型別。看看新興的 Kotlin 程式語言的一個噱頭特性就是可空類型。 PHP 越來越像是「強型別語言了」。對於同一類型的強制要求,可以設定其是否可空。$fn = function (?int $in) { return $in ?? "NULL"; }; $fn(null); $fn(5); $fn(); // TypeError: Too few arguments to function {closure}(), 0 passed in ...
Void 傳回型別
PHP 7.1 引進了 Void 回傳型別。function first(): void { // ... } function second(): void { // ... return; }
以上是介紹php7和PHP5對比的新特性與效能最佳化的詳細內容。更多資訊請關注PHP中文網其他相關文章!