2019-06-17php版本變更5.6-7.0

錯誤和異常處理相關(guān)的變更關(guān)于

在 PHP 7 中屉符,很多致命錯誤以及可恢復(fù)的致命錯誤鲤桥,都被轉(zhuǎn)換為異常來處理了壳炎。 這些異常繼承自?Error?類贬蛙,此類實(shí)現(xiàn)了?Throwable?接口 (所有異常都實(shí)現(xiàn)了這個基礎(chǔ)接口)。

這也意味著锰提,當(dāng)發(fā)生錯誤的時(shí)候曙痘,以前代碼中的一些錯誤處理的代碼將無法被觸發(fā)。 因?yàn)樵?PHP 7 版本中欲账,已經(jīng)使用拋出異常的錯誤處理機(jī)制了屡江。 (如果代碼中沒有捕獲?Error?異常,那么會引發(fā)致命錯誤)赛不。

PHP 7 中的錯誤處理的更完整的描述惩嘉,請參見?PHP 7 錯誤處理。 本遷移指導(dǎo)主要是列出對兼容性有影響的變更踢故。

set_exception_handler()?不再保證收到的一定是?Exception?對象

拋出?Error?對象時(shí)文黎,如果?set_exception_handler()?里的異常處理代碼聲明了類型?Exception?,將會導(dǎo)致 fatal error殿较。

想要異常處理器同時(shí)支持 PHP5 和 PHP7耸峭,應(yīng)該刪掉異常處理器里的類型聲明。如果代碼僅僅是升級到 PHP7淋纲,則可以把類型?Exception?替換成?Throwable劳闹。

當(dāng)內(nèi)部構(gòu)造器失敗的時(shí)候,總是拋出異常

在之前版本中洽瞬,如果內(nèi)部類的構(gòu)造器出錯本涕,會返回?NULL?或者一個不可用的對象。 從 PHP 7 開始伙窃,如果內(nèi)部類構(gòu)造器發(fā)生錯誤菩颖, 那么會拋出異常。

解析錯誤會拋出?ParseError?異常

解析錯誤會拋出?ParseError?異常为障。 對于?eval()?函數(shù)晦闰,需要將其包含到一個?catch?代碼塊中來處理解析錯誤。

E_STRICT 警告級別變更

原有的?E_STRICT?警告都被遷移到其他級別鳍怨。?E_STRICT?常量會被保留呻右,所以調(diào)用?error_reporting(E_ALL|E_STRICT)?不會引發(fā)錯誤。

關(guān)于變量處理的變化

PHP 7 現(xiàn)在使用了抽象語法樹來解析源代碼鞋喇。這使得許多由于之前的PHP的解釋器的限制所不可能實(shí)現(xiàn)的改進(jìn)得以實(shí)現(xiàn)声滥。 但出于一致性的原因?qū)е铝艘恍┨厥饫拥淖儎樱@些變動打破了向后兼容确徙。 在這一章中將詳細(xì)介紹這些例子醒串。

關(guān)于間接使用變量、屬性和方法的變化

對變量鄙皇、屬性和方法的間接調(diào)用現(xiàn)在將嚴(yán)格遵循從左到右的順序來解析芜赌,而不是之前的混雜著幾個特殊案例的情況。 下面這張表說明了這個解析順序的變化伴逸。


使用了舊的從右到左的解析順序的代碼必須被重寫缠沈,明確的使用大括號來表明順序(參見上表中間一列)。 這樣使得代碼既保持了與PHP 7.x的前向兼容性错蝴,又保持了與PHP 5.x的后向兼容性洲愤。

list()處理方式的變更

list()?不再以反向的順序來進(jìn)行賦值

list()?現(xiàn)在會按照變量定義的順序來給他們進(jìn)行賦值,而非反過來的順序顷锰。 通常來說柬赐,這只會影響list()?與數(shù)組的[]操作符一起使用的案例,如下所示:

list($a[],?$a[],?$a[])?=?[1,?2,?3];

var_dump($a);

php5?結(jié)果是:3,2,1

php7?結(jié)果是:1官紫,2肛宋,3

空的list()賦值支持已經(jīng)被移除

list()?結(jié)構(gòu)現(xiàn)在不再能是空的。如下的例子不再被允許:

????list()?=?$a;

????list(,,)?=$a;

????list($x,?list(),?$y)?=?$a;

list()不再能解開string

list()?不再能解開字符串(string)變量束世。 你可以使用str_split()來代替它酝陈。

函數(shù)參數(shù)附近的括號不再影響行為

在 PHP 5中,在以引用方式傳遞函數(shù)參數(shù)時(shí)毁涉,使用冗余的括號對可以隱匿嚴(yán)格標(biāo)準(zhǔn) 的警告〕涟铮現(xiàn)在,這個警告總會觸發(fā)贫堰。

foreach的變化

foreach發(fā)生了細(xì)微的變化穆壕,控制結(jié)構(gòu), 主要圍繞陣列的內(nèi)部數(shù)組指針和迭代處理的修改严嗜。

foreach不再改變內(nèi)部數(shù)組指針? 使用指針時(shí)粱檀,指針位置不會移動

在PHP7之前,當(dāng)數(shù)組通過?foreach?迭代時(shí)漫玄,數(shù)組指針會移動∏羊牵現(xiàn)在開始,不再如此睦优,見下面代碼



foreach?通過值遍歷時(shí)渗常,操作的值為數(shù)組的副本

當(dāng)默認(rèn)使用通過值遍歷數(shù)組時(shí),foreach?實(shí)際操作的是數(shù)組的迭代副本汗盘,而非數(shù)組本身皱碘。這就意味著,foreach 中的操作不會修改原數(shù)組的值隐孽。

foreach通過引用遍歷時(shí)癌椿,有更好的迭代特性

當(dāng)使用引用遍歷數(shù)組時(shí)健蕊,現(xiàn)在?foreach?在迭代中能更好的跟蹤變化。例如踢俄,在迭代中添加一個迭代值到數(shù)組中缩功,參考下面的代碼:


無效的八進(jìn)制字符(Invalid octal literals)

在之前,一個八進(jìn)制字符如果含有無效數(shù)字都办,該無效數(shù)字將被靜默刪節(jié)(0128?將被解析為?012). 現(xiàn)在這樣的八進(jìn)制字符將產(chǎn)生解析錯誤嫡锌。

負(fù)位移運(yùn)算(Negative bitshifts)

以負(fù)數(shù)形式進(jìn)行的位移運(yùn)算將會拋出一個?ArithmeticError

十六進(jìn)制字符串不再被認(rèn)為是數(shù)字

含十六進(jìn)制字符串不再被認(rèn)為是數(shù)字。例如:

被移除的函數(shù)(Removed functions)

call_user_method()?and?call_user_method_array() (移除)

這兩個函數(shù)從PHP 4.1.0開始被廢棄琳钉,應(yīng)該使用call_user_func()?和?call_user_func_array()势木。 你也可以考慮使用?變量函數(shù)?或者?...?操作符。

所有的 ereg* 函數(shù)(移除)

所有?ereg?系列函數(shù)被刪掉了歌懒。?PCRE?作為推薦的替代品啦桌。

mcrypt?別名

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

此外震蒋,已廢棄的?mcrypt_ecb(),?mcrypt_cbc(),?mcrypt_cfb()?和?mcrypt_ofb()?函數(shù)已被移除,請配合恰當(dāng)?shù)?b>MCRYPT_MODE_*?常量來使用?mcrypt_decrypt()進(jìn)行代替躲庄。

移除了 ASP 和 script PHP 標(biāo)簽

使用類似 ASP 的標(biāo)簽查剖,以及 script 標(biāo)簽來區(qū)分 PHP 代碼的方式被移除。 受到影響的標(biāo)簽有:


函數(shù)定義不可以包含多個同名參數(shù)

在函數(shù)定義中噪窘,不可以包含兩個或多個同名的參數(shù)笋庄。 例如,下面代碼中的函數(shù)定義會觸發(fā)?E_COMPILE_ERROR?錯誤:

function?foo($a,?$b,?$unused,?$unused)?{

Switch 語句不可以包含多個 default 塊

在 switch 語句中倔监,兩個或者多個 default 塊的代碼已經(jīng)不再被支持直砂。 例如,下面代碼中的 switch 語句會觸發(fā)?E_COMPILE_ERROR?錯誤:

INI 文件中?#?注釋格式被移除

在 INI 文件中浩习,不再支持以?#?開始的注釋行静暂, 請使用?;(分號)來表示注釋。 此變更適用于?php.ini?以及用?parse_ini_file()?和?parse_ini_string()函數(shù)來處理的文件谱秽。

JSON 擴(kuò)展已經(jīng)被 JSOND 取代

JSON 擴(kuò)展已經(jīng)被 JSOND 擴(kuò)展取代洽蛀。 對于數(shù)值的處理,有以下兩點(diǎn)需要注意的: 第一疟赊,數(shù)值不能以點(diǎn)號(.)結(jié)束 (例如郊供,數(shù)值?34.?必須寫作?34.0或?34)。 第二近哟,如果使用科學(xué)計(jì)數(shù)法表示數(shù)值驮审,e?前面必須不是點(diǎn)號(.) (例如,3.e3?必須寫作?3.0e3?或?3e3)。 另外疯淫,空字符串不再被視作有效的 JSON 字符串地来。

在數(shù)值溢出的時(shí)候,內(nèi)部函數(shù)將會失敗

將浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù)的時(shí)候熙掺,如果浮點(diǎn)數(shù)值太大靠抑,導(dǎo)致無法以整數(shù)表達(dá)的情況下, 在之前的版本中适掰,內(nèi)部函數(shù)會直接將整數(shù)截?cái)啵⒉粫l(fā)錯誤荠列。 在 PHP 7.0 中类浪,如果發(fā)生這種情況,會引發(fā) E_WARNING 錯誤肌似,并且返回?NULL费就。

相等的元素在排序時(shí)的順序問題

由于內(nèi)部排序算法進(jìn)行了提升, 可能會導(dǎo)致對比時(shí)被視為相等的多個元素之間的順序不穩(wěn)定川队。

Note:

在對比時(shí)被視為相等的多個元素之間的排序順序是不可信賴的力细,即使是相等的兩個元素, 他們的位置也可能被排序算法所改變固额。

新特性

標(biāo)量類型聲明

標(biāo)量類型聲明?有兩種模式: 強(qiáng)制 (默認(rèn)) 和 嚴(yán)格模式眠蚂。 現(xiàn)在可以使用下列類型參數(shù)(無論用強(qiáng)制模式還是嚴(yán)格模式): 字符串(string), 整數(shù) (int), 浮點(diǎn)數(shù) (float), 以及布爾值 (bool)。它們擴(kuò)充了PHP5中引入的其他類型:類名斗躏,接口逝慧,數(shù)組和?回調(diào)類型。

function?sumOfInts(int?...$ints){

return? ?array_sum($ints);

}

var_dump(sumOfInts(2,?'3',?4.1));

以上例程會輸出: int(9)

要使用嚴(yán)格模式啄糙,一個?declare?聲明指令必須放在文件的頂部笛臣。這意味著嚴(yán)格聲明標(biāo)量是基于文件可配的。 這個指令不僅影響參數(shù)的類型聲明隧饼,也影響到函數(shù)的返回值聲明(參見?返回值類型聲明, 內(nèi)置的PHP函數(shù)以及擴(kuò)展中加載的PHP函數(shù))

完整的標(biāo)量類型聲明文檔和示例參見類型聲明章節(jié)沈堡。

返回值類型聲明

PHP 7 增加了對返回類型聲明的支持。 類似于參數(shù)類型聲明燕雁,返回類型聲明指明了函數(shù)返回值的類型诞丽。可用的類型與參數(shù)聲明中可用的類型相同拐格。

function?arraysSum(array?...$arrays):?array

null合并運(yùn)算符

由于日常使用中存在大量同時(shí)使用三元表達(dá)式和?isset()的情況率拒, 我們添加了null合并運(yùn)算符 (??) 這個語法糖。如果變量存在且值不為NULL禁荒, 它就會返回自身的值猬膨,否則返回它的第二個操作數(shù)。


太空船操作符(組合比較符)

太空船操作符用于比較兩個表達(dá)式。當(dāng)$a小于勃痴、等于或大于$b時(shí)它分別返回-1谒所、0或1。 比較的原則是沿用 PHP 的常規(guī)比較規(guī)則進(jìn)行的沛申。

//?整數(shù)

echo?1?<=>?1;?//?0

echo?1?<=>?2;?//?-1

echo?2?<=>?1;?//?1

//?浮點(diǎn)數(shù)

echo?1.5?<=>?1.5;?//?0

echo?1.5?<=>?2.5;?//?-1

echo?2.5?<=>?1.5;?//?1

//?字符串

echo?"a"?<=>?"a";?//?0

echo?"a"?<=>?"b";?//?-1

echo?"b"?<=>?"a";?//?1

通過?define()?定義常量數(shù)組

Array?類型的常量現(xiàn)在可以通過?define()?來定義劣领。在 PHP5.6 中僅能通過?const?定義。


Group?use?declarations

從同一?namespace?導(dǎo)入的類铁材、函數(shù)和常量現(xiàn)在可以通過單個?use?語句 一次性導(dǎo)入了尖淘。


整數(shù)除法函數(shù)?intdiv()

新加的函數(shù)?intdiv()?用來進(jìn)行 整數(shù)的除法運(yùn)算。

intdiv(10,?3);

以上例程會輸出:

int(3)

會話選項(xiàng)

session_start()?可以接受一個?array?作為參數(shù)著觉, 用來覆蓋 php.ini 文件中設(shè)置的?會話配置選項(xiàng)村生。

在調(diào)用?session_start()?的時(shí)候, 傳入的選項(xiàng)參數(shù)中也支持?session.lazy_write?行為饼丘, 默認(rèn)情況下這個配置項(xiàng)是打開的趁桃。它的作用是控制 PHP 只有在會話中的數(shù)據(jù)發(fā)生變化的時(shí)候才 寫入會話存儲文件,如果會話中的數(shù)據(jù)沒有發(fā)生改變肄鸽,那么 PHP 會在讀取完會話數(shù)據(jù)之后卫病, 立即關(guān)閉會話存儲文件,不做任何修改典徘,可以通過設(shè)置?read_and_close?來實(shí)現(xiàn)蟀苛。

例如,下列代碼設(shè)置?session.cache_limiter?為?private逮诲,并且在讀取完畢會話數(shù)據(jù)之后馬上關(guān)閉會話存儲文件屹逛。

session_start(['cache_limiter'?=>?'private','read_and_close'?=>?true,]);

變更的函數(shù)

PHP 核心

debug_zval_dump()?現(xiàn)在打印 "int" 替代 "long", 打印 "float" 替代 "double"

dirname()?增加了可選的第二個參數(shù),?depth, 獲取當(dāng)前目錄向上?depth?級父目錄的名稱。

getrusage()?現(xiàn)在支持 Windows.

mktime()?and?gmmktime()?函數(shù)不再接受?is_dst?參數(shù)汛骂。

preg_replace()?函數(shù)不再支持 "\e" (PREG_REPLACE_EVAL). 應(yīng)當(dāng)使用?preg_replace_callback()?替代罕模。

setlocale()?函數(shù)不再接受?category?傳入字符串。 應(yīng)當(dāng)使用?LC_*?常量帘瞭。

exec(),?system()?and?passthru()?函數(shù)對 NULL 增加了保護(hù).

shmop_open()?現(xiàn)在返回一個資源而非一個int淑掌, 這個資源可以傳給shmop_size(),?shmop_write(),?shmop_read(),?shmop_close()?和?shmop_delete().

substr()?現(xiàn)在當(dāng) start 的值與 string 的長度相同時(shí)將返回一個空字符串。

為了避免內(nèi)存泄露蝶念,xml_set_object()?現(xiàn)在在執(zhí)行結(jié)束時(shí)需要手動清除 $parse抛腕。

SAPI 模塊的變化

FPM

listen?端口現(xiàn)在同時(shí)監(jiān)聽 IPv4 和 IPv6 地址。

在 PHP 5 中媒殉,listen?指令如果僅帶一個端口數(shù)字担敌, 則會監(jiān)聽所有網(wǎng)絡(luò)接口,但只是 IPv4廷蓉。 現(xiàn)在 PHP 7 會同時(shí)接受來自 IPv4 和 IPv6 上的請求全封。

指定了 ip 地址后不受此影響;它們會繼續(xù)僅僅監(jiān)聽在指定的地址和協(xié)議上。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刹悴,一起剝皮案震驚了整個濱河市行楞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌土匀,老刑警劉巖子房,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異就轧,居然都是意外死亡证杭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門妒御,熙熙樓的掌柜王于貴愁眉苦臉地迎上來解愤,“玉大人,你說我怎么就攤上這事携丁。” “怎么了兰怠?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵梦鉴,是天一觀的道長。 經(jīng)常有香客問我揭保,道長肥橙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任秸侣,我火速辦了婚禮存筏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘味榛。我一直安慰自己椭坚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布搏色。 她就那樣靜靜地躺著善茎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪频轿。 梳的紋絲不亂的頭發(fā)上垂涯,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機(jī)與錄音航邢,去河邊找鬼耕赘。 笑死,一個胖子當(dāng)著我的面吹牛膳殷,可吹牛的內(nèi)容都是我干的操骡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼当娱!你這毒婦竟也來了吃既?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤跨细,失蹤者是張志新(化名)和其女友劉穎鹦倚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冀惭,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡震叙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了散休。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媒楼。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖戚丸,靈堂內(nèi)的尸體忽然破棺而出划址,到底是詐尸還是另有隱情,我是刑警寧澤限府,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布夺颤,位于F島的核電站,受9級特大地震影響胁勺,放射性物質(zhì)發(fā)生泄漏世澜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一署穗、第九天 我趴在偏房一處隱蔽的房頂上張望寥裂。 院中可真熱鬧,春花似錦案疲、人聲如沸封恰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俭驮。三九已至,卻和暖如春春贸,著一層夾襖步出監(jiān)牢的瞬間混萝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工萍恕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逸嘀,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓允粤,卻偏偏與公主長得像崭倘,于是被迫代替她去往敵國和親翼岁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容