摘要:我們修改上面代碼,再來看下返回值類型限制的情況運行結果這段代碼我們額外聲明了返回值的類型為型。對函數返回值的聲明做了擴充,可以定義其返回值為,無論是否開啟嚴格模式,只要函數中有以外的其他語句都會報錯。
順風車運營研發團隊 王坤 發表至21CTO公眾號(https://mp.weixin.qq.com/s/ph...)
PHP是一種跨平臺開源語言,也是迄今為止最流行的Web開發語言,全球有超過80%的網站由 PHP 驅動。自1994年由Rasmus Lerdorf 創建以來已走過20多年,經歷了6個大版本的更迭。下面就來了解PHP7帶來的新特性。
2015年夏天,備受矚目的PHP7發布了第一個Alpha版本。之后,經過大概3個 Beta 版本和8個RC 版本,2016年1月 PHP7正式發布。PHP7是PHP一個非常重要的版本,相對于PHP5.x 版本,有著非常大的革新,尤其是在性能方面。如果讀者的網站是使用的 PHP5.x,那么使用PHP7后將幾乎無成本的得到一倍的性能提升。感謝開發者!
1. PHP7到底有多快!
下面我們來測試下PHP7性能提升到底有多少。本地環境下以相同的編譯參數分別安裝PHP5.5.38、PHP7的第一個正式版本7.0.2和7.1.0版本,在CLI 模式下運行PHP 源碼中的基準測試腳本。
(1)測試環境
本地搭建的vagrant虛擬機,操作系統CentOS7,單核CPU 2.00GHz,內存1GB。
(2)基準測試指標
q Time——執行時間,以秒為單位;
q %rel, gain——相對于上一版本節省的執行時間;
q %abs, gain——與 PHP 5.5.38 相比腳本節省的執行時間。
測試結果如表1-1所示。
表1-1 測試結果
由上邊的測試結果可以看出來,PHP7.1.0 的基準性能幾乎是PHP5.5.38的3倍左右,開啟了 opcache 的情況下更是達到了4.4倍之多,這是一個非常顯著的提升,這些性能提升是如何做到的呢,本書后續的章節將一一介紹。
注意:這里的測試是純 CPU 的基準測試,5次運行取平均值,不包括其他方面的測試,在實際的項目或者其他運行環境下可能有所差異。
2. PHP7炫目新特性
PHP7 除了在性能方面的極大提升,還添加了很多新的特性,如太空船操作符、標量類型聲明、返回值的類型聲明、全局的 throwable 接口、抽象語法樹等,下邊我們分別介紹。
(1)太空船操作符
太空船操作符用于比較兩個表達式。例如,當 $a 小于、等于或大于 $b 時它分別返回 -1、0 或 1。比較的原則沿用 PHP 的常規比較規則進行。
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
(2)標量類型聲明和返回值的類型聲明
PHP7 可以對下面幾種類型的參數做聲明:字符串(string)、整型 (int)、浮點型 (float) 以及布爾型 (bool)。注意參數類型聲明不受制于默認模式和嚴格模式,都可以聲明。默認模式下,當傳入的參數不符合聲明類型時,會首先嘗試轉換類型;而嚴格模式下,則直接報錯。
例如下面的代碼:
當注釋掉第二行代碼,程序才可以正常運行——PHP 會首先嘗試把 "3.1" 轉為 int 型的 3,然后再執行(注:這里的類型轉換僅受制于可轉換的類型,例如不能把 "a" 轉為 int 型)。但是當開啟嚴格模式后,代碼會直接報錯。因為函數的參數被聲明為 int 型,但是傳入的參數中包含一個string型和一個float型。
我們修改上面代碼,再來看下返回值類型限制的情況:
這段代碼我們額外聲明了返回值的類型為int型。如果返回值的類型不是 int型,在默認模式下,PHP會首先嘗試轉換返回值的類型為 int型,如果不能轉換則會直接報錯。
PHP7.1 對函數返回值的聲明做了擴充,可以定義其返回值為 void,無論是否開啟嚴格模式,只要函數中有 return; 以外的其他 return 語句都會報錯。
注:參數類型不可以是 void。
PHP7.1.0 對參數類型和返回值類型還有進一步的支持,其類型可以是可空類型,在參數或返回值類型聲明前邊加上 “?”, 表示返回值要么是 null 要么是聲明的類型:
(3)null合并操作符
在 PHP7 之前,我們會經常寫這樣的代碼:
PHP7 提供了一個新的語法糖 ??,如果變量存在且值不為NULL,它會返回自身的值,否則返回它的第二個操作數。我們可以這樣改寫代碼:
當代碼中有連續的三元運算符的時候還可以像下邊這樣寫:
看起來是不是簡化了很多?
(4)常量數組
PHP7 之前是無法通過 define 來定義一個數組常量的,PHP7 支持了這個操作:
(5)namespace 批量導入
PHP7 之前如果要導入一個 namespace 下的多個 class ,我們需要這樣寫:
在 PHP7 中支持批量導入:
(6)throwable 接口
在 PHP7 之前,如果代碼中有語法錯誤,或者 fater error 時,程序會直接報錯退出,但是在 PHP7 中有了改變。PHP7 實現了全局 throwable 接口,原來的 Exception 和部分 Error 實現了該接口。這種 Error 可以像 Exception 異常一樣被第一個匹配的 try / catch 塊捕獲。如果沒有匹配的 catch 塊,則調用異常處理函數進行處理。如果尚未注冊異常處理函數,則按照傳統方式處理(Fatal Error)。
Error 類并非繼承自 Exception 類,所以不能用 catch (Exception$e) { ... } 來捕獲 Error。可以用 catch (Error $e) { ... },或者通過注冊異常處理函數(set_exception_handler())來捕獲 Error:
(7)Closure::call()
在 PHP7 之前我們需要動態給一個對象添加方法時可以通過 Closure 來復制一個閉包對象綁定到一個 $this 對象和類作用域:
num + 1; }; $test = $f->bindTo(new Test,"Test"); echo $test(); // 2在 PHP7 中新添加了 Closure::call(),可以通過 call 來暫時綁定一個閉包對象到 $this 對象并調用它:
num + 1; }; echo $f->call(new Test); // 2(8)intdiv 函數
PHP7 還增加了一個新的整除函數,代碼中不需要再手動轉一下了:
(9)list 的方括號寫法
我們知道可以通過 list 來實現解構賦值,如下:
PHP7.1.0 對其做了進一步的優化,可以寫成如下方式:
注意:這里的 [] 并不是數組的意思,只是 list 的簡略形式。
除了上文這些,PHP7 還有很多其他的改變和特性。例如 foreach 遍歷數組不再修改內部指針、移除了 ASP 和 script PHP 標簽、移除了$HTTP_RAW_POST_DATA、匿名類、類常量可見性等,讀者可以自行嘗試。
本文節選自《PHP 7底層設計與源碼實現》
推薦理由:
滴滴出行專家聯合撰寫,PHP領域大咖夏緒宏、韓天峰、王晶、謝華亮(黑夜路人)、伍星聯袂推薦
全面吃透PHP內核架構、核心實現與內存管理、詞法與句法解析、Zend 虛擬機、函數及關鍵擴展等設計細節與源碼實現
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28967.html
摘要:這減輕了手動重復執行相同基準測試的痛苦,并簡化了獲取結果的流程。處理項目的代碼并從標有注釋的方法處生成基準測試程序。用和運行該基準測試得到以下結果。同時,和的基線測試結果也有略微的不同。 Java 8 已經發布一段時間了,許多開發者已經開始使用 Java 8。本文也將討論最新發布在 JDK 中的并發功能更新。事實上,JDK 中已經有多處java.util.concurrent 改動,但...
摘要:我們為了處理這些挑戰,提出了一個新的引用測試框架當然,也是開源的,并且在整個過程中節省了上百萬美元。另一方面,被證實有一些嚴重的缺點部署困難而且慢。在緩存刷新期間,當可用于別的進程的已緩存的文件字節碼在此時損壞,就會導致崩潰。 How Badoo saved one million dollars switching to PHP7 我們成功的把我們的應用遷移到了php7上面(數百臺機...
摘要:本文并不會告訴你抽象語法樹是什么,這需要你自己去了解,這里只是描述給帶來的一些變化。中在語法分析階段不再直接生成,而是先生成,所以過程多了一步詞法掃描分析,將源文件轉換成流語法分析,從流生成抽象語法樹從抽象語法樹生成。 本文大部分內容參照 AST 的 RFC 文檔而成:https://wiki.php.net/rfc/abstract_syntax_tree,為了易于理解從源文檔中節選...
摘要:目前來看等語言還難以企及和。作為一個資深的開發者,在技術上給各位程序十點未來的建議,希望對大家有所幫助。開發者應當學習掌握規范,在開發程序時應當盡量遵循規范。程序員除了寫后臺程序之外,還有很大一部分工作在展現層,和瀏覽器前端打交道。 PHP 從誕生到現在已經有20多年歷史,從Web時代興起到移動互聯網退潮,互聯網領域各種編程語言和技術層出不窮, Node.js 、 GO 、 Pytho...
摘要:在中,源代碼首先將進行詞法分析,將源代碼切割為多個字符串單元,分割后的字符串稱之為。圖以為例解釋型語言的執行示意圖第步源碼通過詞法分析得到第步基于語法分析器生成抽象語法樹第步抽象語法樹轉換為指令集合,解釋執行。 順風車運營研發團隊 李志 發表在程序人生 公眾號我們常用的高級語言有很多種,比較出名的有CC++、Python、 PHP、Go、Pascal等。而這些語言根據運行的方式不同,...
閱讀 2574·2021-10-19 11:41
閱讀 2415·2021-09-01 10:32
閱讀 3377·2019-08-29 15:21
閱讀 1755·2019-08-29 12:20
閱讀 1161·2019-08-29 12:13
閱讀 599·2019-08-26 12:24
閱讀 2520·2019-08-26 10:26
閱讀 827·2019-08-23 18:40