php7 不向後的兼容的變動

php7 不向後的兼容的變動php

在php7中,不少致命錯誤以及可恢復的致命錯誤,都被轉換爲異常來處理了。
數組

這些異常繼承自Error類,此類實現了Throwable接口(全部異常都實現了這個基礎接口)php7

  這就意味着,當發生錯誤的時候,之前的代碼中的一些錯誤處理代碼將沒法被觸發。由於在php7版本中,已經使用拋出異常的錯誤處理機制了。(若是代碼中沒有捕獲Error的異常,那麼會引起致命錯誤)socket

 

  php7中的錯誤處理的更完整描述,請參見 php 7 錯誤處理 本遷移指導主要是列出對兼容性有影響的變動.
函數

當內部構造器失敗的時候,老是拋出異常post

  在以前的版本中,若是內部類的構造器出錯,會返回null或者一個不可用的對象。從php7開始,若是內部類構造器發生錯誤,那麼會拋出異常。性能

解析錯誤會拋出ParseError異常spa

 

  原有的E_STRICT 警告都被遷移到其餘級別。E_STRICT常量會被保留,全部以調用error_reporting(E_ALL|E_STRICT)不會引起錯誤.net

 

變量控制的變動指針

 

  如今 php7 使用新的抽象語法樹 去解析 源文件 。這意味着,在早先php版本中不能改進的一些問題被改善了,提升了性能。

 

間接變量、屬性、方法的變動

  間接訪問的變量,屬性,方法,將嚴格按照從左到右的順序執行,目的是解決之前的一些複雜問題。下面這個表格展現了之前php和php7的執行順序的變動

 

表達式         php5的順序      php7順序

 

list() 函數的變動

  list函數不在逆序賦值

  這個一般在經過數組賦值時有影響

好比:

  

php5 會輸出

  

php7 會輸出

  

 

php7 版本 還不是很推薦去依賴這個順序,由於這個新特性可能會在將來又一次變動,因此你們這個知道就好,開發中儘可能少使用.

list函數 不在支持空的賦值,

好比如下 一些賦值都是不容許的

  

 

list 不在支持對string變量 解包 , 請使用 str_split()函數代替

當數組元素是被引用參數賦值自動產生時,數組的順序的變動

以下:

  

php5 會輸出:

  

php7 會輸出:

  

global 僅 支持簡單變量

以下:

  

 

在函數的參數裏使用帶雙括號函數是無效的,會報出warning

  以下:

    

以上會輸出:

    

foreach的變化(這個比較重要,開發使用頻繁)

  在php7以前,當數組經過foreach迭代時,數組指針會移動。如今開始,不在如此,見下面代碼:

  

php5會輸出:

  

php7會輸出:

  

foreach 經過值遍歷時,操做的值爲數組的副本

 

當默認使用經過值遍歷數組時,foreach實際操做的是數組的迭代副本,而非數組自己。這就意味着,foreach中的操做不會修改原數組的值

foreach經過引用遍歷時,有更好的迭代特性

當使用引用遍歷數組時,如今 foreach 在迭代中能更好的跟蹤變化。例如,在迭代中添加一個迭代值到數組中,參考下面的代碼:

php5 會輸出:

  

php7 會輸出:

  

非Traversable對象的遍歷

 

迭代一個非Traversable對象將會與迭代一個引用數組的行爲相同。這將致使在對象添加或刪除屬性時,foreach 經過引用遍歷時,有更好的迭代特性也能被應用。

 

integer的變動

  之前一個無效的八進制數組默認是被截斷,如今無效的會致使一個解析錯誤。 例如(0128 截斷爲 012

 

負位移

  按負數位移,會拋出一個ArithmeticError異常

好比:

  

php5會輸出:

  

php7會輸出:

  

超出範圍的位移

 

  若是integer位移超出了integer的位寬,會返回0

 

除以0的變動

  在之前的版本中,在/和%中使用0 會觸發一個 E_WARNING,返回結果false.

  php7中 會返回 float型的 +INF , -INF , 或 NAN。

  拋出一個DivisionByZeroError 異常

好比:

php5輸出:

 

php7輸出:

string 處理上的調整

喊十六進制字符串再也不被認爲是數字

例如:

  

php5輸出:

  

php7輸出

  

filter_var() 函數能夠用於檢查一個string是否含有十六進制數字,並將其轉換爲integer

例如:

 

 

\u{  可能引發錯誤

  因爲新的Unicode codepoint excape syntax語法,緊連着無效序列幷包含\u{的字符串可能引發致命錯誤。爲了不這一報錯,應該避免使用反斜槓開頭。

 

被移除的函數

call_user_method() 和 call_user_method_array()

 

call_user_func() 和 call_user_func_array() 從php4.1.0開始被廢棄,你能夠

考慮使用 變量函數 或者 ... 操做符

 

mcrypt aliases

 

  已廢棄的 mcrypt_generic_end() 函數已被移除,請使用mcrypt_generic_deinit()代替。

  此外,已廢棄的 mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb()mcrypt_ofb() 函數已被移除,請配合恰當的MCRYPT_MODE_* 常量來使用 mcrypt_decrypt()進行代替。

 

intl aliases

  已廢棄的 datefmt_set_timezone_id()IntlDateFormatter::setTimeZoneID() 函數已被移除,請使用 datefmt_set_timezone()IntlDateFormatter::setTimeZone()代替。

 

 

set_magic_quotes_runtime(), 和它的別名 magic_quotes_runtime()已被移除. 它們在PHP 5.3.0中已經被廢棄,而且 在in PHP 5.4.0也因爲魔術引號的廢棄而失去功能。

 

已廢棄的 set_socket_blocking() 函數已被移除,請使用stream_set_blocking()代替。

 

 

 

  dl() in PHP-FPM

  dl()在 PHP-FPM 再也不可用,在 CLI 和 embed SAPIs 中仍可用。

 

 

GD 擴展 PostScript Type1 fonts 被移除的函數以下:

  

 

建議使用TrueType fonts 和它們的關聯函數 而代替上面的函數

 

刪除 INI 指令

  下面的INI指令被刪除,同時關聯的特性也被刪除

      

 

 

 

  xsl.security_prefs

 

  xsl.security_prefs  指令已經被刪除,在每一個每一個處理器基礎上使用XsltProcessor::setSecurityPrefs()方法代替,

 其餘向後兼容相關的變動

   new 操做符 建立的對象不能以引用方式複製給變量

    例如:

    

    php5輸出:

                                               

    php7 輸出:

   

 

 無效的類、接口以及 trait 命名

 

      

    不能如下列名字來命名類、接口以及 trait:

    

  • bool
  • int
  • float
  • string
  • NULL
  • TRUE  

    此外,也不要使用下列的名字來命名類、接口以及 trait。雖然在 PHP 7.0 中, 這並不會引起錯誤, 可是這些名字是保留給未來使用的。

    

  移除了 ASP 和 script PHP 標籤

 

 

 

 

 

 

例如:

php5輸出:

php7輸出:

 

 

相關文章
相關標籤/搜索