搜尋
首頁後端開發PHP7一起看看php7的重大新特性

一起看看php7的重大新特性

Jun 28, 2020 pm 04:26 PM
php7新特性


一起看看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[&#39;bar&#39;][&#39;baz&#39;]

//PHP5
($$foo)[‘bar&#39;][&#39;baz&#39;]

//PHP7: 遵循从左到右的原则
${$foo[‘bar&#39;][&#39;baz&#39;]}

#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[&#39;name&#39;] ? $_GET[&#39;name&#39;] : &#39;&#39;;//Notice: Undefined index: …
//php7
$_GET[&#39;name&#39;] ?? &#39;&#39; -> &#39;&#39;;

//\u{xxxx} - Unicode字符的解析
echo "\u{4f60}";//你
echo "\u{65b0}";//新

傳回類型的宣告

function getInt() : int {
  return “test”;
};

getInt();

//PHP5
#PHP Parse error: parse error, expecting &#39;{&#39;...

//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)”&#39;...

//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中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具