一起看看php7的重大新特性
#截止到目前為止,PHP官方已經發布了php7的RC5版本,現在來說php7的重大特性肯定已經是定型了,不會再有什麼變動了。後續一些版本的迭代主要也就是修修bug,優化之類的。下面就來說話我們一直期待的php7會有那些主要的改變了。
新特性預覽
ZEND引擎升级到Zend Engine 3,也就是所谓的PHP NG 增加抽象语法树,使编译更加科学 64位的INT支持 统一的变量语法 原声的TLS - 对扩展开发有意义 一致性foreach循环的改进 新增 <=>、**、?? 、\u{xxxx}操作符 增加了返回类型的声明 增加了标量类型的声明 核心错误可以通过异常捕获了 增加了上下文敏感的词法分析
相關學習推薦:PHP 程式設計從入門到精通
移除的一些特性
1.移除一些舊的擴展,被移遷移到了PECL(例如:mysql)
2.移除SAPIs的支援
3.4.16進位的字串轉換被廢除了
//PHP5 "0x10" == "16" //PHP7 "0x10" != "16"
5.HTTP_RAW_POST_DATA移除了(可以使用php://input替代)
6.靜態函數裡面不再支援透過一個不相容的$this呼叫非靜態的函數了
$o = & new className{},不再支援這樣的寫法
7.php.ini檔案移除了#作為註釋,統一用;去註解
一些行為的改變
不在支援函數定義同名參數
類型的同名建構子不建議使用了(目前沒有移除,後續會移除)
String、int 、float等這些關鍵字不能被當作類別名稱使用了
func_get_args()取得的是目前變數的值
function test ($num) { $num++; var_dump(func_get_args()[0]); }; test(1) //PHP5 int(1) //PHP7 int(2)
下面就挑選了一些主要的、核心的、對我們PHPer來說比較重要的特性介紹一下
PHP NG
新的php引擎優化了很多地方,也正式因為如此,才使得php7相對於php5效能有了接近兩倍的提升!
ZVAL結構的重構
左邊是PHP5的zval(24位元組),右邊是PHP7的zval(16位元組) ;
可以看出來php7的zval要比php5還要複雜,但卻能從24個位元組下降到16個位元組,為什呢?
在C語言中struct的每一個成員變數要各自佔據一塊獨立的記憶體空間,而union裡的成員變數是共用一塊記憶體空間(php7中大量使用union替換了struct)。因此,雖然成員變數看起來多了不少,但是實際佔據的記憶體空間有很多都是公用的卻下降了。
使用新的Zend Array替換先前的HashTale結構
#我們php程式中使用最多、最有用、最方便、最靈活的就是陣列了,而php5它的底層就是HashTable實現的,php7使用了新的Zend Array類型,效能和存取速度上都有了大幅提升!
一些非常常用,開銷不大的的函數直接變成了引擎支援的opcode
call_user_function(_array) => ZEND_INIT_USER_CALL is_int/string/array/* => ZEND_TYPE_CHECK strlen => ZEND_STRLEN defined => ZEND+DEFINED
使用了新的記憶體分配,管理方式,減少了記憶體的浪費
核心排序zend_sort的優化
//PHP5 - 快速排序(非稳定排序) array(1 => 0, 0 => 0) //PHP7 - 快速排序+选择排序(稳定排序) array(0 => 0, 1 => 0)
小於16個元素的使用選擇排序,大於16個依照16個為單位去分割,分別使用選擇排序,然後再全部合起來使用快速排序。排序較前相比,內部元素由非穩定排序變成穩定排序,減少元素的交換次數,減少對記憶體的操作次數,效能提升40%
抽象語法樹
假如現在我們有這樣的需求,要對php來源檔案就行語法偵測,實作編碼規格。 php5之前的話,沒有AST,直接從parser就生成了opcodes!就需要藉助一些外部的php語法解析器來實現;而php7增加了AST,我們可以自己去實現這樣一個擴展,利用擴展提供的函數可以直接獲取文件對應的的AST結構,而這樣的結構正是我們可以辨識的,所以就可以在這個基礎上去做一些優化和判斷了。
64位元的INT支援
支援儲存大於2GB的字串
支援上傳大小大於2GB的檔案
保證字串在所有平台上【64位元】都是64bit
統一的語法變數
$$foo['bar']['baz'] //PHP5 ($$foo)[‘bar']['baz'] //PHP7: 遵循从左到右的原则 ${$foo[‘bar']['baz']}
#foreach迴圈的改進
//PHP5 $a = array(1, 2, 3);foreach ($a as $v){var_dump(current($a));} int(2) int(2) int(2) $a = array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a));} int(2) int(3) bool(false) $a = array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a));} int(1) int(1) int(1) //PHP7:不再操作数据的内部指针了 $a = array(1, 2, 3);foreach ($a as $v){var_dump(current($a))} int(1) int(1) int(1) $a = array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a)) int(1) int(1) int(1) $a = array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a))} int(1) int(1) int(1)
新增的幾個運算子
//<=> - 比较两个数的大小【-1:前者小于后者,0:前者等于后者,1:前者大于后者】 echo 1 <=> 2;//-1 echo 1 <=> 1;//0 echo 1 <=> 0;//1 // ** - 【a的b次方】 echo 2 ** 3;//8 //?? - 三元运算符的改进 //php5 $_GET['name'] ? $_GET['name'] : '';//Notice: Undefined index: … //php7 $_GET['name'] ?? '' -> ''; //\u{xxxx} - Unicode字符的解析 echo "\u{4f60}";//你 echo "\u{65b0}";//新
傳回類型的宣告
function getInt() : int { return “test”; }; getInt(); //PHP5 #PHP Parse error: parse error, expecting '{'... //PHP7 #Fatal error:Uncaught TypeError: Return value of getInt() must be of the type integer, string returned
標量類型的宣告
function getInt(int $num) : int { return $num; }; getInt(“test”); //PHP5 #PHP Catchable fatal error: Argument 1 passed to getInt() must be an instance of int, string given… //PHP7 #Fatal error: Uncaught TypeError: Argument 1 passed to getInt() must be of the type integer, string given…
核心錯誤可以透過例外擷取了
try { non_exists_func(); } catch(EngineException $e) { echo “Exception: {$e->getMessage();}\n”; } //这里用php7试了一下还是没法捕获,但是看鸟哥介绍说是可行的。。。 #Exception: Call to undefined function non_exists_func()
上下問敏感的詞法分析
//PHP5 class Collection {public function foreach($arr) {}} #Parse error: parse error, expecting `"identifier (T_STRING)”'... //PHP7 class Collection { public function foreach($arr) {} public function in($arr){} public function where($condition){} public function order($condition){} } $collection = new Collection(); $collection->where()->in()->foreach()->order();
差不多了,基本上就把自己對php7的初步了解說完了,其中肯定有很多不對的、低級的錯誤,希望各位兄弟及時指正,我好改一下,做個筆記!嘿嘿!
以上是一起看看php7的重大新特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

解決 PHP 7.0 中插件未顯示已安裝問題的方法:檢查插件配置並啟用插件。重新啟動 PHP 以套用配置變更。檢查插件檔案權限,確保其正確。安裝遺失的依賴項,以確保插件正常運作。如果其他步驟都失敗,則重建 PHP。其他可能原因包括外掛程式版本不相容、載入錯誤版本或 PHP 配置問題。

PHP8.3發布:新功能一覽隨著技術的不斷發展和需求的不斷變化,程式語言也不斷更新和改進。作為一種廣泛應用於網頁開發的腳本語言,PHP一直在不斷進步,為開發者提供更強大和高效的工具。最近發布的PHP8.3版本帶來了許多期待已久的新功能和改進,以下讓我們來看看這些新特性的一覽。非空屬性的初始化在過去的PHP版本中,如果一個類別的屬性沒有明確賦值,它的值

深入解析PHP8的新特性,幫助您掌握最新技術隨著時間的推移,PHP程式語言一直在不斷演進和改進。最近發布的PHP8版本為開發者提供了許多令人興奮的新功能和改進,為我們的開發工作帶來了更多便利和效率。在本文中,我們將深入解析PHP8的新特性,並提供具體的程式碼範例,旨在幫助您更好地掌握這些最新的技術。 JIT編譯器PHP8引進了JIT(Just-In-Time)編

PHP伺服器環境常見的解決方法包括:確保已安裝正確的PHP版本和已複製相關檔案到模組目錄。暫時或永久停用SELinux。檢查並配置PHP.ini,確保已新增必要的擴充功能和進行正確設定。啟動或重新啟動PHP-FPM服務。檢查DNS設定是否有解析問題。

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

在Docker環境中使用PECL安裝擴展時報錯的原因及解決方法在使用Docker環境時,我們常常會遇到一些令人頭疼的問�...

php8新特性有JIT 編譯器、型別推導、命名參數、聯合型別、屬性、錯誤處理改進、非同步程式支援、新的標準函式庫函數和匿名類的擴充等。詳細介紹:1、JIT編譯器,PHP8引入了JIT編譯器,這是一個重要的效能改進,JIT編譯器可以對一些高頻執行的程式碼進行即時編譯和最佳化,從而提高運行速度;2、類型推導,PHP8引入了類型推導功能,允許開發者在宣告變數時自動推導出變數的類型等等。

本機環境:redhat6.7系統。 nginx1.12.1,php7.1.0,程式碼使用yii2框架問題:本地的web站需要用到elasticsearch服務。當php使用本機伺服器搭建的elasticsearch時,本地的負載都是正常。當我使用aws的elasticsearchservice服務時,本地伺服器出現負載經常過高的情況。查看nginx和php日誌,發現沒有異常。系統的並發連線數也不高。這時候想到我們老闆跟我講的一個strace診斷工具。偵錯過程:找一個php的子程序idstrace-
