PHP 8.5.0 RC4 available for testing

新機能

PHP コア

パイプ演算子

パイプ演算子(|>) が追加されました。

<?php
$result
= "Hello World" |> strlen(...);
print
$result . PHP_EOL; // Prints "11"

定数式にクロージャ

定数式に、クロージャ第一級callable を指定できるようになりました。 これらを指定できる箇所として、以下が挙げられます:

  • アトリビュートの引数
  • プロパティやパラメーターのデフォルト値
  • 定数および、クラス定数

#[\NoDiscard] アトリビュート

関数の戻り値が重要であり、 その値を使うべきことを示すアトリビュートとして、 NoDiscard が追加されました。

また、値を意図的に使わないことを指示する (void) キャストが追加されました。 (void) キャストは、 プログラムそのものの実行には影響しませんが、 #[\NoDiscard] アトリビュートが発生させる警告や、 外部の IDE や静的解析ツールが発生させる可能性がある、 診断メッセージを抑制する目的に使えます。

<?php

#[\NoDiscard]
function
concat(string $a, string $b): string {
return
a + b;
}

// Warning: The return value of function concat() should either be used or
// intentionally ignored by casting it as (void) in xxx.php
concat("a", "b");

// 戻り値が代入されているため、警告は出ません
$results = concat("a", "b");

// (void) キャストが使われているので、警告は出ません
(void)concat("a", "b");

定数に対するアトリビュート

クラス定数でないコンパイル時定数 (例: define('MY_CONST', 1); ではなく、 const MY_CONST = 1; の形で定義するもの) に対して、アトリビュートを指定できるようになりました。

定数に対して、Deprecated アトリビュートを指定できるようになりました。

#[\DelayedTargetValidation] アトリビュート

無効なターゲットに指定した、 PHP コア(または拡張モジュール) のアトリビュートから発生するコンパイル時エラーを抑制する手段として、 DelayedTargetValidation アトリビュートが追加されました。 このアトリビュートが抑制したエラーは代わりに、 ReflectionAttribute::newInstance() がコールされたタイミングで、実行時に報告されます。

プロパティに対する #[\Override] 指定

プロパティに、Override アトリビュートを指定できるようになりました。

static プロパティに対する、非対称可視性の指定

非対称可視性プロパティ が、static プロパティをサポートしました。

Fatal Error 発生時のバックトレース

(Maximum execution time exceeded のような) 致命的なエラーにも、 バックトレースが含まれるようになりました。

final プロパティと、コンストラクタのプロモーション

final なプロパティも、 コンストラクタでプロパティに昇格 させることができるようになりました。

定数式をキャスト

定数式をキャストできるようになりました。

<?php
const T1 = (int) 0.3; // PHP 8.5.0 より前は、"Fatal error: Constant expression contains invalid operations" が発生していました
print T1 . PHP_EOL; // Prints "0"

Clone キーワードへの変更

clone キーワード は、関数のように振る舞うようになりました。 そして、読み取り専用プロパティに clone して値を再代入する際に、 新しく $withProperties パラメータが使えるようになりました

cURL

複数のリクエストにまたがって持続する CurlSharePersistentHandle のサポートが追加されました。 これを使うと、より効率的な接続の再利用が安全にできるようになります。

curl_getinfo() 関数に、 CURLINFO_USED_PROXY (libcurl >= 8.7.0), CURLINFO_HTTPAUTH_USED (libcurl >= 8.12.0), CURLINFO_PROXYAUTH_USED (libcurl >= 8.12.0) のサポートが追加されました。 curl_getinfo() が配列を返す場合、 これらの情報は "used_proxy", "httpauth_used", "proxyauth_used" というキーで利用できます。 CURLINFO_USED_PROXY は、 直近の転送でプロキシを使った場合にゼロでない値を、 使わなかった場合にゼロを返します。 CURLINFO_HTTPAUTH_USEDCURLINFO_PROXYAUTH_USED は、 直近の転送で HTTP および、プロキシ経由の認証メソッドを示す情報を、 ビットマスクで返します。利用可能な値は、 CURLAUTH_* を参照ください。

CURLOPT_INFILESIZE を安全に置き換えられる、 CURLOPT_INFILESIZE_LARGE が追加されました。 特定のシステムでは、たとえ 64bit システムであっても、 CURLOPT_INFILESIZE は 32bit の符号付き整数(2.0 Gib) しか受け入れない場合があります。 CURLOPT_INFILESIZE_LARGE は、 システムが扱える整数の最大値を受け入れます。

curl_setopt() 関数に指定する、 CURLOPT_FOLLOWLOCATION オプション向けに、 CURLFOLLOW_OBEYCODE, CURLFOLLOW_FIRSTONLY, CURLFOLLOW_ALL が追加されました。 CURLFOLLOW_OBEYCODE は、 許可されている場合に、より厳密にリダイレクトを行います。 CURLFOLLOW_FIRSTONLY は、 最初のリダイレクトのみを行います。そのため、 その後に後続のリダイレクトがあったとしても、それ以上はリダイレクトしません。 CURLFOLLOW_ALL は、 CURLOPT_FOLLOWLOCATIONtrue に設定することと同じです。

curl_getinfo() 関数に、 CURLINFO_CONN_ID のサポートが追加されました (libcurl >= 8.2.0)。 この定数を使うと、 cURL の転送で使ったユニークな接続IDを取得できるようになります。 このIDは、主に PHP レベルでのアプリケーションにおいて、 接続の再利用や接続のプーリング処理が必要な場合に役立ちます。 curl_getinfo()が配列を返す場合、 この値は "conn_id" キーとして利用できます。

curl_getinfo() 関数に、 CURLINFO_QUEUE_TIME_T のサポートが追加されました (libcurl >= 8.6.0)。 この定数を使うと、 リクエストが送信される前に libcurl の接続キューで待機した時間(マイクロ秒単位)を取得できます。 curl_getinfo()option パラメーターに CURLINFO_QUEUE_TIME_T を渡すことで、値が取得できます。

TLS で使う署名アルゴリズムを指定する定数として、 CURLOPT_SSL_SIGNATURE_ALGORITHMS が追加されました。

DOM

Dom\Element::$outerHTML が追加されました。

Dom\ParentNode の実装に、 $children プロパティが追加されました。

EXIF

OffsetTime* Exif タグが追加されました。

HEIF/HEIC のサポートが追加されました。

Filter

フィルタ関数に渡すと、 検証に失敗した際に強制的に例外を発生させる FILTER_THROW_ON_FAILURE フラグが追加されました。 この新しいフラグは、 FILTER_NULL_ON_FAILURE と組み合わせることはできません。 組み合わせようとすると、 ValueError がスローされます。

Intl

様々な通貨関連の数値フォーマット向けに、 クラス定数 NumberFormatter::CURRENCY_ISO, NumberFormatter::CURRENCY_PLURAL, NumberFormatter::CASH_CURRENCY, NumberFormatter::CURRENCY_STANDARD が追加されました。

指定されたロケールで likely tag を処理するために、 Locale::addLikelySubtags()Locale::minimizeSubtags() が追加されました。

IntlListFormatter クラスが追加されました。 これは、指定されたロケールで項目のリストをフォーマット、順序付け、 句読点を付ける操作を行うためのものです。 クラス定数として、IntlListFormatter::TYPE_AND, IntlListFormatter::TYPE_OR, IntlListFormatter::TYPE_UNITS 演算子と、 IntlListFormatter::WIDTH_WIDE, IntlListFormatter::WIDTH_SHORT, IntlListFormatter::WIDTH_NARROW があります。 このクラスは ICU 67 以降でサポートされます。

PDO_Sqlite

クラス定数 Pdo\Sqlite::ATTR_BUSY_STATEMENT が追加されました。

クラス定数 Pdo\Sqlite::ATTR_EXPLAIN_STATEMENT, Pdo\Sqlite::EXPLAIN_MODE_PREPARED, Pdo\Sqlite::EXPLAIN_MODE_EXPLAIN, Pdo\Sqlite::EXPLAIN_MODE_EXPLAIN_QUERY_PLAN が追加されました。

接続する際の属性として、 Pdo\Sqlite::ATTR_TRANSACTION_MODE を追加しました。 これに指定可能な値は、 Pdo\Sqlite::TRANSACTION_MODE_DEFERRED, Pdo\Sqlite::TRANSACTION_MODE_IMMEDIATE, Pdo\Sqlite::TRANSACTION_MODE_EXCLUSIVE があります。 これを使うと、beginTransaction() 呼び出し時に使用するトランザクションモードを構成できます。

Session

session_set_cookie_params(), session_get_cookie_params(), session_start() 関数は、 "partitioned" というキー経由で、 パーティショニングされた Cookie をサポートしました。

SOAP

SoapClient::__getTypes() が、 列挙型の case をダンプするようになりました。

Soap 1.2 の Reason テキスト向けに、xml:lang 属性のサポートが追加されました。

上記のサポートによって、 SoapFault::__construct()SoapServer::fault() のシグネチャに、 オプションの $lang パラメータが追加されました。 これによって、.NET SOAP クライアントとの互換性問題が解決します。

Standard

mail() は、sendmail の実際のエラーを返すようになり、 sendmail プロセスが予期せず終了したかどうかを検出するようになりました。 予期せず終了した場合、警告が発生し、この関数は false を返します。 これより前のバージョンでは、こうしたエラーは黙って無視されていました。 この変更は、sendmail を使ったメール送信にのみ影響します。

getimagesize() が、HEIF/HEIC 画像をサポートしました。

libxml 拡張モジュールがロードされている場合に、 getimagesize() は SVG 画像もサポートするようになりました。 同様に、image_type_to_extension()image_type_to_mime_type() も、 IMAGETYPE_SVG を処理するようになりました。

getimagesize() が返す配列に、 2つエントリが追加されました: "width_unit""height_unit" です。 これらは、寸法がどの単位で表現されているかを示します。 これらの単位は px がデフォルトですが、 必ずしも同じ単位であるとは限りません (一例を挙げると、片方が cm で、もう片方が px である場合があります)

setcookie()setrawcookie() 関数が、"partitioned" キーをサポートしました。

URI

RFC 3986 と WHATWG URL に従い、 URI と URL を処理するのに使える拡張モジュールが追加されました。 これは、常に有効になっています。

XSL

XSLTProcessor::getParameter(), XSLTProcessor::setParameter(), XSLTProcessor::removeParameter()$namespace 引数は、 空でなくても動作するようになりました。 動作するのは、$name 引数が Clark 記法でなく、かつ QName 形式でもない場合です。 これらの場合は、名前空間が href または prefix からそれぞれ取得されるためです。

Zlib

flock() が、zlib ストリームをサポートしました。 これより前のバージョンでは、あらゆるロック操作を行う際に常に失敗していました。

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top