首頁  >  文章  >  後端開發  >  一起看看php7的重大新特性

一起看看php7的重大新特性

coldplay.xixi
coldplay.xixi轉載
2020-06-28 16:26:423411瀏覽


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

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