1. 程式人生 > >php7 不向後的相容的變更

php7 不向後的相容的變更

在php7中,很多致命錯誤以及可恢復的致命錯誤,都被轉換為異常來處理了。

這些異常繼承自Error類,此類實現了Throwable介面(所有異常都實現了這個基礎介面)

  這就意味著,當發生錯誤的時候,以前的程式碼中的一些錯誤處理程式碼將無法被觸發。因為在php7版本中,已經使用丟擲異常的錯誤處理機制了。(如果程式碼中沒有捕獲Error的異常,那麼會引發致命錯誤)

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

當內部構造器失敗的時候,總是丟擲異常

  在之前的版本中,如果內部類的構造器出錯,會返回null或者一個不可用的物件。從php7開始,如果內部類構造器發生錯誤,那麼會丟擲異常。

解析錯誤會丟擲ParseError異常

  原有的E_STRICT 警告都被遷移到其他級別。E_STRICT常量會被保留,所有以呼叫error_reporting(E_ALL|E_STRICT)不會引發錯誤

變數控制的變更

  現在 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

intl aliases

dl() in PHP-FPM

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

GD 擴充套件 PostScript Type1 fonts 被移除的函式如下:

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

刪除 INI 指令

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

  xsl.security_prefs

 其他向後相容相關的變更

   new 操作符 建立的物件不能以引用方式複製給變數

    例如:

    

    php5輸出:

                                               

    php7 輸出:

   

 無效的類、介面以及 trait 命名

    不能以下列名字來命名類、介面以及 trait:

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

    此外,也不要使用下列的名字來命名類、介面以及 trait。雖然在 PHP 7.0 中, 這並不會引發錯誤, 但是這些名字是保留給將來使用的。

  移除了 ASP 和 script PHP 標籤

例如:

php5輸出:

php7輸出: