このセクションで明示的に述べられていなくても、 新しい関数、 クラス、インターフェイス、列挙型、 または定数は、 再宣言によるErrorがスローされる可能性があります。
    exit() (およびdie())
    言語構造は、関数のように振る舞います。
    これにより、callableとして渡すことができ、
    
    strict_types 宣言の影響を受け、
    任意の非整数値を文字列にキャストする代わりに、通常の型強制を行います。
   
そのため、exit() および die() に 無効な型を渡すと、一貫してTypeError が スローされるようになりました。
    __clone() 内で readonly プロパティを間接的に変更することは、
    もはや許可されなくなりました。例えば、$ref = &$this->readonly のようなコードです。
    これは readonly の初期化時にはすでに禁止されており、
    「クローン時の readonly の再初期化」の実装における見落としでした。
   
アップロードされたファイルや tempnam() 関数で作成されるファイルの名前は、 以前より13バイト長くなりました。 総合的な長さは引き続きプラットフォーム依存です。
   いくつかの resource が object に移行されました。
   is_resource() を使用した戻り値のチェックは、
   特に指定がない限り、false かどうかを確認するように置き換える必要があります。
  
    DBA 関数は、
    dba_connection resource の代わりに
    Dba\Connection オブジェクトを受け取り、返すようになりました。
   
    ODBC 関数は、
    odbc_result resource の代わりに
    Odbc\Result オブジェクトを受け取り、返すようになりました。
   
    ODBC 関数は、
    odbc_connection resource の代わりに
    Odbc\Connection オブジェクトを受け取り、返すようになりました。
   
    SoapClient::$httpurl プロパティは、
    soap_url resource の代わりに
    Soap\Url オブジェクトになりました。
    is_resource() を使用したチェック
    (例: is_resource($client->httpurl))は、
    null かどうかのチェック(例: $client->httpurl !== null)に置き換える必要があります。
   
    SoapClient::$sdl プロパティは、
    soap_sdl resource の代わりに
    Soap\Sdl オブジェクトになりました。
    is_resource() を使用したチェック
    (例: is_resource($client->sdl))は、
    null かどうかのチェック(例: $client->sdl !== null)に置き換える必要があります。
   
プログラミングエラー、つまり無効な値が引数として提供された場合にトリガーされる 新しい警告と例外が追加されました。
    curl_multi_select() は、
    timeout パラメータが 0 未満または
    PHP_INT_MAX を超える場合、
    ValueError をスローするようになりました。
   
    imagejpeg(), imagewebp(), imagepng(), imageavif()
    は、無効な quality が渡された場合、
    ValueError をスローするようになりました。
   
    imageavif() は、
    無効な speed パラメータ値が渡された場合、
    ValueError をスローするようになりました。
   
    imagescale() は、
    width または height パラメータが
    アンダーフロー/オーバーフローした場合、
    ValueError をスローするようになりました。
   
    imagescale() は、
    無効な mode パラメータ値が渡された場合、
    ValueError をスローするようになりました。
   
    imagefilter() は、
    IMG_FILTER_SCATTER フィルタで、
    sub または plus パラメータが
    アンダーフロー/オーバーフローした場合、
    ValueError をスローするようになりました。
   
    bind_textdomain_codeset(), textdomain(), d()*gettext()
    は、domain が空文字列の場合、
    ValueError をスローするようになりました。
   
resourcebundle_get()、 ResourceBundle::get()、および ResourceBundle オブジェクトでのオフセットアクセスは、 以下の場合に例外をスローするようになりました:
    IntlDateFormatter::__construct() は、
    locale が無効な場合、
    ValueError をスローするようになりました。
   
    NumberFormatter::__construct() は、
    locale が無効な場合、
    ValueError をスローするようになりました。
   
    mb_encode_numericentity() および
    mb_decode_numericentity() は、
    map が int のみで構成されているかをチェックし、
    そうでない場合 ValueError をスローするようになりました。
   
    mb_http_input() は、
    type が無効な場合、常に
    ValueError をスローするようになりました。
   
    mb_http_output() は、
    encoding にヌルバイトが含まれていないかをチェックし、
    含まれている場合 ValueError をスローするようになりました。
   
    odbc_fetch_row() は、
    row が 0 以下の場合、
    false を返すようになりました。この場合、警告が発せられます。
   
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
     session.gc_divisor に正でない値を設定したり、 session.gc_probability に負の値を設定したりすると、警告が発生するようになりました。
simplexml_import_dom() に非XMLオブジェクトを渡すと、 ValueError の代わりに TypeError をスローするようになりました。
    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::open() または XMLReader::XML() に渡すと、 ValueError をスローするようになりました。
ヌルバイトを含む string を渡すと、以前は警告が発せられていましたが、 現在は ValueError をスローするようになりました。
ヌルバイトを含む string を渡すと、以前は警告が発せられていましたが、 現在は ValueError をスローするようになりました。
XSLTProcessor::setParameter() は、 引数にヌルバイトが含まれる場合、ValueError をスローするようになりました。 これは、そもそも正しく動作していませんでした。
XSLTProcessor::importStyleSheet() に 非XMLオブジェクトを渡すと、ValueError の代わりに TypeError がスローされるようになりました。
評価中にPHP関数コールバックの呼び出しに失敗した場合、 警告の発生ではなく、例外がスローされるようになりました。
   相対的な書式
   の number シンボルは、
   再び複数の符号を受け入れるようになりました。
   たとえば +-2 のような形式です。
  
   一部のDOMメソッドは、新しいノードを割り当てられない場合、以前は
   false を返すか、DOM_PHP_ERR コードの
   DOMException をスローしていました。
   これらは現在、一貫して DOM_INVALID_STATE_ERR コードの
   DOMException をスローするようになりました。
   この状況は極めてまれであり、影響を受ける可能性は低いです。
   その結果、DOMImplementation::createDocument() は、
   
   戻り値の型が、以前の DOMDocument|false から
   DOMDocument になりました。
  
以前は、DOMXPath オブジェクトをクローンできましたが、 返されるオブジェクトは使用できませんでした。 これはもはや可能ではなく、DOMXPath オブジェクトをクローンすると、 Error がスローされるようになりました。
DOMImplementation::getFeature() メソッドは削除されました。
GMP クラスは final になり、継承できなくなりました。
無効な文字列(エンコーディングエラーを含む)に対して、 mb_substr() は他の多くの mbstring 関数と同様に、 文字インデックスを解釈するようになりました。 これにより、mb_strpos() が返す文字インデックスを mb_substr() に渡すことができます。
SJIS-Mac(MacJapanese) 文字列の場合、mb_substr() に渡される文字インデックスは、文字列が Unicode に変換されたときに生成される Unicode コードポイントのインデックスを参照します。 これは、 SJIS-Mac の約40文字が複数の Unicode コードポイントの シーケンスに変換されることによる重要な処理です。
   未使用でドキュメント化されていない定数
   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 のエイリアスであり、削除されました。
   
  
   MySQL サーバーの待機タイムアウトに対して報告されるエラーコードは、
   MySQL サーバーバージョン 8.0.24 以降で
   2006 から 4031 に変更されました。
  
   64ビットアーキテクチャ上での
   opcache.interned_strings_buffer
   設定の最大値は 32767 になりました。
   以前は 4095 でした。
  
    JIT のデフォルトの設定値は、
    opcache.jit=tracing
    および opcache.jit_buffer_size=0
    から、 opcache.jit=disable および
    opcache.jit_buffer_size=64M にそれぞれ変更されました。
   
これはデフォルトの動作には影響しません。 JIT は引き続きデフォルトで無効になっています。 ただし、 opcache.jit_buffer_size ではなく、 opcache.jit を通じて無効化されています。 これは、以前に opcache.jit_buffer_size のみを使用して JIT を有効にし、 opcache.jit を使用してJIT モードを指定していなかったユーザーに影響を与える可能性があります。 JIT コンパイルを有効にするには、 opcache.jit の設定値を適切に設定してください。
JIT コンパイルが有効になっている場合、 JIT コンパイラの初期化に何らかの理由で失敗すると、 PHP は起動時に致命的なエラーで終了するようになりました。
   pcntl_sigprocmask()、
   pcntl_sigwaitinfo()、
   および pcntl_sigtimedwait() 関数は、
   失敗時に常に false を返すようになりました。
   以前は場合によっては -1 を返すことがありました。
  
   バンドルされた pcre2lib はバージョン 10.44 に更新されました。
   その結果、{,3} はテキストとしてではなく
   量指定子として認識されるようになりました。
   さらに、UCP モードでの一部の文字クラスの意味が変更されました。
   完全な変更ログは » PCRE2 Changelog を
   参照してください。
  
   Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER および
   Pdo\Dblib::ATTR_DATETIME_CONVERT 属性は、
   整数属性の代わりにブール属性として動作するようになりました。
   したがって、PDO::setAttribute() を介して属性を設定し、
   PDO::getAttribute() を介して取得する場合、
   bool を期待または返却します。
  
   PDO::ATTR_AUTOCOMMIT 属性は、
   整数属性の代わりにブール属性として動作するようになりました。
   したがって、PDO::setAttribute() を介して属性を設定し、
   PDO::getAttribute() を介して取得する場合、
   bool を期待または返却します。
  
この拡張モジュールはいくつかの Firebird C++ API を公開するようになったため、 この拡張モジュールをビルドするには C++ コンパイラが必要になりました。 さらに、この拡張モジュールは fbclient 3.0 以上にでコンパイルする必要があります。
   PDO::ATTR_AUTOCOMMIT、
   PDO::ATTR_EMULATE_PREPARES、
   PDO::MYSQL_ATTR_DIRECT_QUERY 属性は、
   整数属性の代わりにブール属性として動作するようになりました。
   したがって、PDO::setAttribute() を介して属性を設定し、
   PDO::getAttribute() を介して取得する場合、
   bool を期待または返却します。
  
DSN に認証情報が設定されている場合、PDO コンストラクタの引数よりも優先されるようになり、 ドキュメントの記述に近くなりました。
SimpleXMLElement は XML 要素の 表現であるだけでなく、RecursiveIterator でもあります。 PHP 8.4.0 より前では、一部のメソッド(例: SimpleXMLElement::asXML() や SimpleXMLElement::getName())および それらのインスタンスの string へのキャストすると、 暗黙的にイテレータをリセットしていました。
これはイテレータが巻き戻されるため、予期しない無限ループを引き起こす可能性がありました。 例えば:
<?php
$xmlString = "<root><a><b>1</b><b>2</b><b>3</b></a></root>";
$xml = simplexml_load_string($xmlString);
$nodes = $xml->a->b;
foreach ($nodes as $nodeData) {
    echo "nodeData: " . $nodeData . "\n";
    $xml = $nodes->asXml();
}これは無限ループを引き起こしていました。
nodeData: 1 nodeData: 2 nodeData: 2 nodeData: 2 nodeData: 2 nodeData: 2 nodeData: 2 // ...
しかし、この動作は修正され、 SimpleXMLElement は明示的に巻き戻されない限り、 イテレータをリセットしなくなりました。 つまり、前述の例は現在では次のようになります:
nodeData: 1 nodeData: 2 nodeData: 3
   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 拡張モジュールを読み込んでください。
   strcspn() で
   characters に空文字列を指定すると
   文字列の長さが返されるようになりました。
   以前は、最初のヌルバイトで誤って停止していました。
   
  
http_build_query() は、Backed Enumを正しく処理するようになりました。
stream_bucket_make_writeable() および stream_bucket_new() は、 stdClass のインスタンスではなく、 StreamBucket のインスタンスを返すようになりました。
コンストラクタでの失敗時に、警告を発して壊れたオブジェクトになるのではなく、 例外をスローするようになりました。
   xml_set_()*_handler()
   関数は、handler パラメータに対して
   callable|string|null の
   有効なシグネチャを宣言し、チェックするようになりました。
   さらに、xml_set_object() で設定されたオブジェクトのメソッド名に対応する
   string 型の値は、事前に渡されたオブジェクトのクラス上にメソッドが存在するかどうかが
   チェックされるようになりました。
   従って、xml_set_object() は、
   callable メソッドを設定する前に呼び出す必要があります。
   ハンドラを無効にするために空文字列を渡すことは引き続き許可されていますが、
   非推奨となりました。
  
しかし、xml_set_object() と callable でない文字列を渡すことは非推奨です。 そのようなインスタンスをメソッドを直接参照する callable に 変更することをお勧めします。
