2024 年日本 PHP 研討會

不相容的變更

防止 number_format() 返回負零

先前,number_format() 函式有可能回傳 -0。雖然根據 IEEE 754 浮點數規範,這是完全有效的,但這種特殊情況對於以人類可讀的格式顯示格式化數字來說並不可取。

<?php

var_dump
(number_format(-0.01)); // 現在輸出 string(1) "0",而不是 string(2) "-0"

轉換物件和陣列轉型中的數字鍵

現在,在將陣列轉型為物件以及將物件轉型為陣列時(透過明確轉型或使用 settype()),數字鍵的處理方式得到了改進。

這意味著從轉型為物件的陣列中的整數(或字串形式的整數)鍵現在可以被存取

<?php

// 陣列轉物件
$arr = [0 => 1];
$obj = (object) $arr;
var_dump(
$obj,
$obj->{'0'}, // 現在可以存取
$obj->{0} // 現在可以存取
);

上述範例將輸出

object(stdClass)#1 (1) {
  ["0"]=>    // string key now, rather than integer key
  int(1)
}
int(1)
int(1)

而從轉型為陣列的物件中的整數(或字串形式的整數)鍵現在可以被存取

<?php

// 物件轉陣列
$obj = new class {
public function
__construct()
{
$this->{0} = 1;
}
};
$arr = (array) $obj;
var_dump(
$arr,
$arr[0], // 現在可以存取
$arr['0'] // 現在可以存取
);

上述範例將輸出

array(1) {
  [0]=>    // integer key now, rather than string key
  int(1)
}
int(1)
int(1)

禁止將 null 傳遞給 get_class()

先前,將 null 傳遞給 get_class() 函式會輸出外層類別的名稱。現在已移除此行為,改為輸出 E_WARNING 警告。要達到與先前相同的行為,只需省略該參數即可。

計算不可數類型時發出警告

現在,嘗試對不可計數的類型使用 count() 函式 (包含其別名 sizeof() 函式) 時,將會發出 E_WARNING 警告。

<?php

var_dump
(
count(null), // NULL 不可計數
count(1), // 整數不可計數
count('abc'), // 字串不可計數
count(new stdClass), // 未實作 Countable 介面的物件不可計數
count([1,2]) // 陣列可計數
);

上述範例將輸出

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d
int(0)
int(1)
int(1)
int(1)
int(2)

將 ext/hash 從資源移至物件

作為長期從資源遷移的一部分,雜湊 (Hash) 擴充功能已更新為使用物件而非資源。 除了需要將 is_resource() 檢查更新為 is_object() 之外,此變更對 PHP 開發人員來說應該是無縫的。

改進 SSL/TLS 預設值

已對預設值進行以下變更

  • tls:// 現在預設為 TLSv1.0 或 TLSv1.1 或 TLSv1.2
  • ssl://tls:// 的別名
  • STREAM_CRYPTO_METHOD_TLS_* 常數預設為 TLSv1.0 或 TLSv1.1 + TLSv1.2,而不是僅 TLSv1.0

已關閉資源的 gettype() 回傳值

先前,在已關閉的資源上使用 gettype() 會回傳字串 "unknown type"(未知類型)。 現在,將回傳字串 "resource (closed)"(資源 (已關閉))。

is_object()__PHP_Incomplete_Class

先前,在 __PHP_Incomplete_Class 類別上使用 is_object() 會回傳 false。 現在,將回傳 true

提升未定義常數的錯誤級別

未定義常數的非限定參考現在將產生 E_WARNING 警告 (而不是 E_NOTICE 通知)。 在下一個主要版本的 PHP 中,它們將產生 Error 例外。

Windows 支援

官方支援的最低 Windows 版本現在是 Windows 7/Server 2008 R2。

檢查 trait 的預設屬性值

trait 預設屬性值的相容性檢查將不再執行類型轉換。

類別名稱的 object

object 名稱先前在 PHP 7.0 中是軟保留的。 現在是硬保留的,禁止將其用作類別、trait 或介面名稱。

NetWare 支援

現在已移除 NetWare 支援。

使用 SORT_STRINGarray_unique()

array_unique() 搭配 SORT_STRING 使用時,先前會複製陣列並移除不唯一的元素(之後不壓縮陣列),現在則會透過添加唯一元素來建立新的陣列。這可能導致不同的數字索引。

bcmod() 處理浮點數的變更

bcmod() 函式不再將小數截斷為整數。因此,它的行為現在遵循 fmod(),而不是 % 運算子。例如,bcmod('4', '3.5') 現在返回 0.5 而不是 1

雜湊函式和非加密雜湊

hash_hmac()hash_hmac_file()hash_pbkdf2()hash_init()(搭配 HASH_HMAC 使用)函式不再接受非加密雜湊。

json_decode() 函式的選項

如果第二個參數 (assoc) 為 null,現在會使用 json_decode() 函式的選項 JSON_OBJECT_AS_ARRAY。先前,JSON_OBJECT_AS_ARRAY 總是被忽略。

rand()mt_rand() 的輸出

在 64 位元機器上,由 rand()mt_rand() 針對特定種子生成的序列可能與 PHP 7.1 不同(因為修正了實作中的一個模數偏差錯誤)。

移除 sql.safe_mode ini 設定

sql.safe_mode ini 設定已被移除。

date_parse()date_parse_from_format() 的變更

date_parse()date_parse_from_format() 返回的陣列中的 zone 元素現在代表秒數而不是分鐘數,並且其符號已反轉。例如,-120 現在是 7200

傳入的 Cookie

從 PHP 7.2.34 開始,基於安全考量,傳入 Cookie 的*名稱*不再進行 URL 解碼。

新增註記

使用者貢獻的註記

此頁面沒有使用者貢獻的註記。
To Top