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
已廢棄的 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()代替。
GD 擴展 PostScript Type1 fonts 被移除的函數如下:
- imagepsbbox()
- imagepsencodefont()
- imagepsextendfont()
- imagepsfreefont()
- imagepsloadfont()
- imagepsslantfont()
- imagepstext()
建議使用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輸出: