下位互換性のない変更点
このセクションで明示的に述べられていなくても、
新しい関数、
クラス、インターフェイス、列挙型、
または定数は、
再宣言によるErrorがスローされる可能性があります。
PHP コア
exit の動作の変更
exit (およびdie)
言語構造は、関数のように振る舞います。
これにより、callableとして渡すことができ、
strict_types
宣言の影響を受け、
任意の非整数値を文字列にキャストする代わりに、通常の型強制を行います。
そのため、exit および die に
無効な型を渡すと、一貫してTypeError が
スローされるようになりました。
比較中の再帰
比較中に再帰が発生すると、
E_ERROR
の致命的なエラーの代わりに、
Error 例外がスローされるようになりました。
readonly プロパティの間接的な変更
__clone()
内で readonly プロパティを間接的に変更することは、
もはや許可されなくなりました。例えば、$ref = &$this->readonly
のようなコードです。
これは readonly の初期化時にはすでに禁止されており、
「クローン時の readonly の再初期化」の実装における見落としでした。
定数の型の変更
PHP_DEBUG
および PHP_ZTS
定数の型が、
int から bool に変更されました。
一時ファイル名の長さ
アップロードされたファイルや tempnam 関数で作成されるファイルの名前は、
以前より13バイト長くなりました。
総合的な長さは引き続きプラットフォーム依存です。
E_STRICT
エラーレベルの削除
E_STRICT
エラーレベルは、
PHPエンジン内で使用されなくなったため削除されました。
E_STRICT
定数は非推奨となりました。
型が追加された拡張クラスの定数
以下の拡張クラスは、定数に型が宣言されました:
リソースからオブジェクトへの移行
いくつかの リソース が object に移行されました。
is_resource を使用した戻り値のチェックは、
特に指定がない限り、false
かどうかを確認するように置き換える必要があります。
DBA
DBA 関数は、
dba_connection
リソース の代わりに
Dba\Connection オブジェクトを受け取り、返すようになりました。
ODBC
ODBC 関数は、
odbc_result
リソース の代わりに
Odbc\Result オブジェクトを受け取り、返すようになりました。
ODBC 関数は、
odbc_connection
リソース の代わりに
Odbc\Connection オブジェクトを受け取り、返すようになりました。
SOAP
SoapClient::$httpurl プロパティは、
soap_url
リソース の代わりに
Soap\Url オブジェクトになりました。
is_resource を使用したチェック
(例: is_resource($client->httpurl)
)は、
null
かどうかのチェック(例: $client->httpurl !== null
)に置き換える必要があります。
SoapClient::$sdl プロパティは、
soap_sdl
リソース の代わりに
Soap\Sdl オブジェクトになりました。
is_resource を使用したチェック
(例: is_resource($client->sdl)
)は、
null
かどうかのチェック(例: $client->sdl !== null
)に置き換える必要があります。
新しい警告と例外
プログラミングエラー、つまり無効な値が引数として提供された場合にトリガーされる
新しい警告と例外が追加されました。
cURL
curl_multi_select は、
timeout
パラメータが 0
未満または
PHP_INT_MAX
を超える場合、
ValueError をスローするようになりました。
GD
- imagejpeg
- imagewebp
- imagepng
- imageavif
は、無効な
quality
が渡された場合、
ValueError をスローするようになりました。
imageavif は、
無効な speed
パラメータ値が渡された場合、
ValueError をスローするようになりました。
imagescale は、
width
または height
パラメータが
アンダーフロー/オーバーフローした場合、
ValueError をスローするようになりました。
imagescale は、
無効な mode
パラメータ値が渡された場合、
ValueError をスローするようになりました。
imagefilter は、
IMG_FILTER_SCATTER
フィルタで、
sub
または plus
パラメータが
アンダーフロー/オーバーフローした場合、
ValueError をスローするようになりました。
Gettext
- bind_textdomain_codeset
- textdomain
- d*gettext
は、
domain
が空文字列の場合、
ValueError をスローするようになりました。
Intl
resourcebundle_get、
ResourceBundle::get、および
ResourceBundle オブジェクトでのオフセットアクセスは、
以下の場合に例外をスローするようになりました:
-
無効なオフセット型の場合、TypeError
-
空の string の場合、ValueError
-
整数インデックスが符号付き32ビット整数に収まらない場合、
ValueError
IntlDateFormatter::__construct は、
locale
が無効な場合、
ValueError をスローするようになりました。
NumberFormatter::__construct は、
locale
が無効な場合、
ValueError をスローするようになりました。
MBString
mb_encode_numericentity および
mb_decode_numericentity は、
map
が int のみで構成されているかをチェックし、
そうでない場合 ValueError をスローするようになりました。
mb_http_input は、
type
が無効な場合、常に
ValueError をスローするようになりました。
mb_http_output は、
encoding
にヌルバイトが含まれていないかをチェックし、
含まれている場合 ValueError をスローするようになりました。
ODBC
odbc_fetch_row は、
row
が 0
以下の場合、
false
を返すようになりました。この場合、警告が発せられます。
PCNTL
pcntl_sigprocmask、
pcntl_sigwaitinfo、および
pcntl_sigtimedwait 関数は、次の場合エラーをスローするようになりました:
-
signals
配列が空の場合、
ValueError
(pcntl_sigprocmask で
mode
が SIG_SETMASK
のときを除く)
-
signals
配列の値が int でない場合、
TypeError
-
signals
配列の値が有効なシグナル番号でない場合、
ValueError
pcntl_sigprocmask 関数は、
mode
が SIG_BLOCK
、
SIG_UNBLOCK
、SIG_SETMASK
のいずれでもない場合、
ValueError をスローするようになりました。
pcntl_sigtimedwait 関数は、次の場合エラーをスローするようになりました:
-
seconds
が 0
未満の場合、
ValueError
-
nanoseconds
が 0
未満
または 1e9
を超える場合、
ValueError
-
seconds
および nanoseconds
が両方とも
0
の場合、ValueError
SimpleXML
simplexml_import_dom に非XMLオブジェクトを渡すと、
ValueError の代わりに
TypeError をスローするようになりました。
Standard
round 関数は、 mode
の値を検証し、
無効なモードの場合、ValueError をスローするようになりました。
以前は、無効なモードは PHP_ROUND_HALF_UP
と解釈されていました。
str_getcsv は、
separator
および enclosure
引数が
1バイトの長さでない場合、または escape
引数が
1バイトの長さでないか空文字列でない場合、
ValueError をスローするようになりました。
これは、fputcsv および fgetcsv の動作と
同じになるように合わせたものです。
php_uname 関数は、
mode
が無効な場合、
ValueError をスローするようになりました。
unserialize の
"allowed_classes"
オプションは、
クラス名の array でない場合、
TypeError および
ValueError をスローするようになりました。
XMLReader
無効な文字エンコーディングを
XMLReader::open または
XMLReader::XML に渡すと、
ValueError をスローするようになりました。
ヌルバイトを含む string を渡すと、以前は警告が発せられていましたが、
現在は ValueError をスローするようになりました。
XMLWriter
ヌルバイトを含む string を渡すと、以前は警告が発せられていましたが、
現在は ValueError をスローするようになりました。
XSL
XSLTProcessor::setParameter は、
引数にヌルバイトが含まれる場合、ValueError をスローするようになりました。
これは、そもそも正しく動作していませんでした。
XSLTProcessor::importStyleSheet に
非XMLオブジェクトを渡すと、ValueError の代わりに
TypeError がスローされるようになりました。
評価中にPHP関数コールバックの呼び出しに失敗した場合、
警告の発生ではなく、例外がスローされるようになりました。
DOM
一部のDOMメソッドは、新しいノードを割り当てられない場合、以前は
false
を返すか、DOM_PHP_ERR
コードの
DOMException をスローしていました。
これらは現在、一貫して DOM_INVALID_STATE_ERR
コードの
DOMException をスローするようになりました。
この状況は極めてまれであり、影響を受ける可能性は低いです。
その結果、 DOMImplementation::createDocument は、
戻り値の型が、以前の DOMDocument|false
から
DOMDocument になりました。
以前は、DOMXPath オブジェクトをクローンできましたが、
返されるオブジェクトは使用できませんでした。
これはもはや可能ではなく、DOMXPath オブジェクトをクローンすると、
Error がスローされるようになりました。
DOMImplementation::getFeature メソッドは削除されました。
GMP
GMP クラスは final になり、継承できなくなりました。
MBString
無効な文字列(エンコーディングエラーを含む)に対して、
mb_substr は他の多くの mbstring 関数と同様に、
文字インデックスを解釈するようになりました。
これにより、mb_strpos が返す文字インデックスを
mb_substr に渡すことができます。
SJIS-Mac(MacJapanese) 文字列の場合、mb_substr
に渡される文字インデックスは、文字列が Unicode に変換されたときに生成される
Unicode コードポイントのインデックスを参照します。
これは、 SJIS-Mac の約40文字が複数の Unicode コードポイントの
シーケンスに変換されることによる重要な処理です。
MySQLi
未使用でドキュメント化されていない定数
MYSQLI_SET_CHARSET_DIR
は削除されました。
MYSQLI_STMT_ATTR_PREFETCH_ROWS
定数は削除されました。
この機能は mysqlnd では利用できません。
MYSQLI_CURSOR_TYPE_FOR_UPDATE
および
MYSQLI_CURSOR_TYPE_SCROLLABLE
定数は
削除されました。この機能は mysqlnd および libmysql のどちらでも
実装されていませんでした。
未使用の MYSQLI_TYPE_INTERVAL
定数は、
現在は MYSQLI_TYPE_ENUM
のエイリアスであり、削除されました。
MySQLnd
MySQL サーバーの待機タイムアウトに対して報告されるエラーコードは、
MySQL サーバーバージョン 8.0.24 以降で
2006
から 4031
に変更されました。
PCNTL
pcntl_sigprocmask、
pcntl_sigwaitinfo、
および pcntl_sigtimedwait 関数は、
失敗時に常に false
を返すようになりました。
以前は場合によっては -1
を返すことがありました。
PCRE
バンドルされた pcre2lib はバージョン 10.44 に更新されました。
その結果、{,3}
はテキストとしてではなく
量指定子として認識されるようになりました。
さらに、UCP モードでの一部の文字クラスの意味が変更されました。
完全な変更ログは » PCRE2 Changelog を
参照してください。
PDO_DBLIB
Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER
および
Pdo\Dblib::ATTR_DATETIME_CONVERT
属性は、
整数属性の代わりにブール属性として動作するようになりました。
したがって、 PDO::setAttribute を介して属性を設定し、
PDO::getAttribute を介して取得する場合、
bool を期待または返却します。
PDO_FIREBIRD
PDO::ATTR_AUTOCOMMIT
属性は、
整数属性の代わりにブール属性として動作するようになりました。
したがって、 PDO::setAttribute を介して属性を設定し、
PDO::getAttribute を介して取得する場合、
bool を期待または返却します。
この拡張モジュールはいくつかの Firebird C++ API を公開するようになったため、
この拡張モジュールをビルドするには C++ コンパイラが必要になりました。
さらに、この拡張モジュールは fbclient 3.0 以上にでコンパイルする必要があります。
PDO_MYSQL
PDO::ATTR_AUTOCOMMIT
、
PDO::ATTR_EMULATE_PREPARES
、
PDO::MYSQL_ATTR_DIRECT_QUERY
属性は、
整数属性の代わりにブール属性として動作するようになりました。
したがって、 PDO::setAttribute を介して属性を設定し、
PDO::getAttribute を介して取得する場合、
bool を期待または返却します。
PDO_PGSQL
DSN に認証情報が設定されている場合、PDO コンストラクタの引数よりも優先されるようになり、
ドキュメントの記述に近くなりました。
SimpleXML
SimpleXMLElement は XML 要素の
表現であるだけでなく、RecursiveIterator でもあります。
PHP 8.4.0 より前では、一部のメソッド(例:
SimpleXMLElement::asXML や
SimpleXMLElement::getName)および
それらのインスタンスの string へのキャストすると、
暗黙的にイテレータをリセットしていました。
これはイテレータが巻き戻されるため、予期しない無限ループを引き起こす可能性がありました。
例えば:
SOAP
SoapClient::$typemap は、resource ではなく
array になりました。
is_resource を使用したチェック
(例: is_resource($client->typemap)
)は、
null
かどうかのチェック(例: $client->typemap !== null
)に置き換える必要があります。
SOAP 拡張モジュールには、session 拡張モジュールへの
オプションの依存関係が追加されました。
PHP が session 拡張モジュールなしでビルドされ、かつ
--enable-rtld-now 構成フラグが有効になっている場合、
SOAP 拡張モジュールも使用していると、
起動時にエラーが発生します。
これを解決するには、rtld-now を使用しないか、session 拡張モジュールを読み込んでください。
Standard
strcspn で
characters
に空文字列を指定すると
文字列の長さが返されるようになりました。
以前は、最初のヌルバイトで誤って停止していました。
http_build_query は、Backed Enumを正しく処理するようになりました。
stream_bucket_make_writeable および
stream_bucket_new は、
stdClass のインスタンスではなく、
StreamBucket のインスタンスを返すようになりました。
Tidy
コンストラクタでの失敗時に、警告を発して壊れたオブジェクトになるのではなく、
例外をスローするようになりました。
XML
xml_set_*_handler
関数は、handler
パラメータに対して
callablestringnull の
有効なシグネチャを宣言し、チェックするようになりました。
さらに、xml_set_object で設定されたオブジェクトのメソッド名に対応する
string 型の値は、事前に渡されたオブジェクトのクラス上にメソッドが存在するかどうかが
チェックされるようになりました。
従って、xml_set_object は、
callable メソッドを設定する前に呼び出す必要があります。
ハンドラを無効にするために空文字列を渡すことは引き続き許可されていますが、
非推奨となりました。
しかし、xml_set_object と
callable でない文字列を渡すことは非推奨です。
そのようなインスタンスをメソッドを直接参照する callable に
変更することをお勧めします。