PHP 8.6 は PHP 9.0 でのみ使用可能です – JaguarJack
関数アプリケーションの一部、Time\Duration、およびコンテンツの一部は PHP 9.0 用です。
このテキストは PHP 8.6 beta 3 の抜粋に基づいています。
PHP 8.6 は 2026 年 11 月 19 日にリリースされ、8.5 よりも小さい可能性があります。JIT なし、プロパティ フックなし)、ジョイント タイプなし — 記述方法に変更はありません。
したがって、8.6 へのアップグレードには午後 1 日しかかからないという結論になります。 8.6 ではコードがクリーンになり、PHP 9.0 アップグレードの苦痛を回避する方法になります。
注意すべき点が 3 つあります。関数アプリケーションの一部は非常に優れた言語機能であり、昨年のパイプライン オペレーターに欠けていたものの半分を埋めてくれました。 Time\Duration は小規模なクラスであり、標準ライブラリの設計ミスは 20 年間修正されてきました。そして、このバージョンの本当のテーマである約 30 項目が放棄されました。これらはノイズではなく、この言語の次の方向性を示す明確で読みやすい地図です。
次に、この 3 つの部分について説明し、次に移行計画を示します。
头号の特徴:部分機能適用
これは本当に広く議論される機能であり、賛成 33 票、反対 0 票で可決されました。このタイプの全童の現場の全语系结果在电影電影的劇情主讲述
それは次のとおりです。1 つの関数を呼び出しますが、一部のパラメータが空です。その結果、残りの関数が待機しています。残りは残りのパラメータが空です。
占位符には2種類あります。? 場所を表示し、パラメータを 1 つ受け取ります。... 「他のすべてのパラメータは、何であっても」。
これを使用すると、開発者は、生成されたクローズド パッケージ署名を再配置できます。API によって定義されたインターフェイスにパラメーター シーケンスを渡す必要がある場合、これは大きな影響を与えます。
なぜ今注目すべきなのでしょうか?
PHP 8.5 はパイプライン オペレーターを提供しており、パイプラインのアプリケーションの一部がないため、単一パラメーターとしてのみ使用できます。
fn($s) => trim($s)
|> fn($s) => str_replace(' ', '-', $s)
|> fn($s) => mb_strtolower($s)
|> fn($s) => mb_substr($s, 0, 50);
trim(?)
|> str_replace(' ', '-', ?)
|> mb_strtolower(?)
|> mb_substr(?, 0, 50);
2 番目の段落は、上記の映画のストーリーの主に説明されている映画の説明です。 Closure::fromCallable() 和一堆电影,PHP 中早時間电影無点技术(ドットのないスタイル);而して电影,如是皖是编是技术
チームには必ず他の誰かがいるはずだ
アプリケーションの一部のパラメーターは、呼び出し時ではなく、アプリケーションの一部が作成された時点のものです。
speak($who, getArg()); // getArg() 每次调用都会执行
もし getArg() これはリクエスト、クロック、または変数コンテナを読み取るため、これらは 2 つの異なるプログラムです。事前に意識するか、アロー機能を変更してください。
制限
一部の機能が使用できない new(应改用電影安全),使用できません __get/__set(これらはメソッドの形式で呼び出されないため、一部のアプリケーション オブジェクトでは使用できません)、呼び出しスコープの関数を読み取る関数自体にも使用できません—compact()、extract()、func_get_arg()、get_defined_vars()アプリケーションの機能の中心的な目的に合わせて機能領域を変更するため、これらの機能は最初から実現可能な範囲にありません。
有一语系结果设计体育: 具名パラメータは位置パラメータの後に表示されます ? 警告ではなく重大なエラーです。
また、8.1 で導入されたファーストクラスの呼び出し可能オブジェクトとは異なることも理解する価値があります。foo(...) これは関数自体への参照ですが、PFA は事前に新しいパラメーターのセットとして構築されます。 #[\NoDiscard] 与 #[\SensitiveParameter]ターゲット オブジェクトが属性に関連する反射操作を行う場合は、再調整する必要があります。
時間\期間:名公開一延组亁十小年 API 电影瑕疑
標準ライブラリに関する小さなテスト。sleep() 秒を受け取ります。usleep() マイクロ秒を受信します。stream_set_timeout() 秒とマイクロ秒を 2 つのパラメータとして受け取ります。curl_setopt() の CURLOPT_TIMEOUT 数秒でCURLOPT_TIMEOUT_MS ミリ秒単位。Redis クライアントは浮動小数点を受け取ります。誰も記憶を使うことができませんでした。
PHP8.6の導入 final readonly class Time\Duration(賛成 35 票、反対 1 票)、終わったら自分のユニットを運べるようにしましょう:
add($halfSecond);
// 读起来就像指数退避的指数退避实现
$delay = $baseDelay->multiplyBy(2 ** $attempt);
ファクトリ メソッドは、予期されるすべての単位をカバーします。fromNanoseconds()、fromMicroseconds()、fromMilliseconds()、fromSeconds(int $s, int $ns = 0)、fromMinutes()、fromHours() そして fromIso8601DurationString()例を示します add()、sub()、multiplyBy(int)、divideBy(int)、negate()、absolute() 和静的 compare(),此外にも読むだけ $seconds、$nanoseconds 与 $negative 属性。
指摘する価値のある設計上の決定が 2 つあります。これらの決定こそが、このクラスが優れており、冗長性がない理由だからです。
日付ではなく、時計です。月には意味がない、年もない、夏もない。 DateInterval 責任。Duration 「長い間待っている」という表現に使われます。
それはインフラストラクチャであり、文法ではありません。 8.6 では、カーネルが最初に使用されます。 IO\Poll\Context::wait(?Time\Duration $timeout)これは単なる単一のオープンソースであり、その値はメソッドのリストには含まれませんが、この後、各受信が明確で統一され、依存型を導入しないことによってカーネルで受け入れられる場合にのみ含まれます。フレームワークとクライアント ライブラリは、既存の int/float パラメータに加えて、1 つの 2 つのバージョン内で 1 つの 2 つのバージョンになることが予想されます。 Duration。
RC 段階で必要なことが 1 つあります。最終ビルドでは、既存のコア機能は何ですか? Durationこれは開発プロセス中に変更されており、初期の記事間の表現は一貫していません。
誰もパイプラインを直接使用できません
PHP 8.6 は、単層 I/O 多路用 API を提供します—IO\Poll\Context、StreamPollHandle、Event::Read:
add(new StreamPollHandle($stream), [Event::Read], ['type' => 'server']);
$watchers = $context->wait(Duration::fromSeconds(1));
电影直说其受众在線:申請コードがあなたに連絡することはありません。しかし、それでも重要です。ReactPHP、SwoAmp「SwoAmp」スタイルのさまざまな実行時間、現在 stream_select() または、各拡張機能の上にイベント ラウンド クエリを再実装すると、エッジの動作が異なり、プラットフォームのサポートも異なります。この種のオリジナル言語は、相互に互換性のないイディオムのグループからコア、正確には「单步PHP」に出現し、実行時に独自の属性のパスになります。
これは 8.6 年のリターンではなく、5 年のリターンです。それだけの価値はあるので、続けてください。
注目に値するその他の改善点
次のコンテンツは分割する必要がないため、すぐに読むことができます。
clamp()——clamp(101, min: 0, max: 100)戻る100同様に適用できる文字列:clamp("a", "x", "z")戻る"x"誰もがこの補助関数を作成したので、削除できるようになりました。- 特に重要な場合は、ただ读属性にデフォルト値 ——早该说、在電影计属性通子を設定できます。
#[\Override]サポート类常量 —— 8.3 この属性の導入はまだ拡張中です: 8.5 では属性が与えられ、8.6 では属性が与えられました。enum SortDirection { Ascending; Descending; }—— 組み込みの代替ソリューションは、各プロジェクトを置き換えて SORT_ASC スタイルの整数を常量再宣言します。- 设计可能な枚下 —— 枚下可電影
__debugInfo()。 - パラメータ上料例文全部——
function store(/** @param Book[] */ array $books): void {}構文の小さな変更は、配列形状の静的分析の点で、非常に大きな利点となります。 - エラー情報の改善 — エラーには関数パラメーターが表示されるようになりました。
json_decode()純粋なデバッグエクスペリエンスの向上、また、両方の時点での会議の活性化方法を克服する - 反射 —— 属性上の
isReadable()与isWriteable()、そして電影城小一時間。 - 霰包の最終作 —— 無料のパフォーマンス アップグレードと考えることができます。この霰は依然として無線校正器の電気的効果がなく、無引火の熱不燃性です。
pack()/unpack()的便序修新符 ——<与>浮動小数点および整数シンボルに使用できるようになりました。
同様に、以下もあります。grapheme_strrev()、mysqli_quote_string()、Locale::getDisplayKeyword()、IntlNumberRangeFormatter、ストリームの TLS セッション リカバリと 0-RTT 初期データ、慣性のために使用 Pdo\Pgsql::ATTR_CHUNK_SIZE、gmp_powm_sec() 与 gmp_prevprime()、リモートストリーミングをサポート finfo_file()、これは 8.5 の RFC 3986 / WHATWG URL を以前のクラスの URI にすることができます。
プロポーズは失敗した
否決された提案も可決された提案も同じように問題を説明できます。
- パイプライン
|>=)— 決定されるかどうかにかかわらず、テキストは、より良いものを設定できる。 let微生物学/階層電界 —— どうかどうか。letまだキーワードとして保留されていますが、これについては本文の後半で再度説明します。- 結果として、消去された夫型の部分 (マージンによって消去された一般的な型) が — 承認されるかどうか。
__exists()、カテゴリー「被失」と「被任我们 null」の魔教要——否か決定。array_only_keys()/array_except_keys()、array_path_get()/array_path_exists()、前方/後方電気効果——全体全体が左右されるかどうか。- 画像設定では、画像の表示時間の唯一の属性が設定されます。
- 破棄
list()—— 23 票对 23 票、これは三分の二の旅行、list()予約されます。
これらの提案の形式を参照してください。PHP カーネル開発者 (内部) は、必要に応じて、一連の便利な関数をすべて使用しないことをほぼ決定しました。 array_except_keys(),それはエンジンの責任ではなく、Laravel の責任です。
两件事没能银上这车,未だ他们下載:电视电视设计(自動読み込み機能、5とマーク)もあります。 BackedEnum::values()。ReflectionAttribute::getCurrent() ベータ段階ではまだ投票中のため、信頼する前に最終ステータスを確認する必要があります。
転送: 本当に仕事をしている
ここには PHP 8.0 のような壁はありません。エンジンの書き換えや大面積タイプのエラーはありません。 8.4 以降で実行されているアプリケーションの場合、テストは完了しています。バージョン アップグレードは 1 回だけで、グリーン テストに合格するのは 1 回だけです。
処理量はすべて推奨される順序に従っています。
1. バージョンをアップグレードし、表示されるようにします
php -d error_reporting=E_ALL -d display_errors=1 vendor/bin/phpunit
CI がブロックされている場合 E_DEPRECATED—— 多くの CI は実際にそうです — その後、テストに合格し、バージョンがリリースされ、これらの放棄された項目はすべてパススルーされ、バージョンがリリースされ、ハード エラーとして継承されます。それらを開くと、その行数は破棄されます。この数値は、実際のアップグレード作業の見積もりです。
2.免费机式重最好
零電影、純粋な検索置換:
| 製造中止 | 代替案 |
|---|---|
is_double() |
is_float() |
is_integer()、is_long() |
is_int() |
doubleval() |
floatval() |
spl_object_hash() |
spl_object_id() |
spl_classes() |
反射または表示 |
strcoll()、SORT_LOCALE_STRING |
国際的 Collator |
metaphone() |
soundex(),またはユーザーの音声ライブラリ |
mysqli_stmt_init()、mysqli_get_charset() |
前処理済みの文章/リンク属性を直接使用 |
define() の $case_insensitive |
もう一度定義するだけで正確さを保証します |
3. 配列位置の設定を停止する
これは、実際にコード ライブラリに表示される可能性が最も高いクラスです。オブジェクトは次の関数の入力ですarray_walk()、array_walk_recursive()、deflate_init()、inflate_init()、zlib と bzip2 ストリーム フィルター パラメーター、mb_convert_variables() そして http_build_query()修理方法はほぼ常に利用可能です get_object_vars($obj)。
array_walk() 投票結果は賛成41票、反対3票で、この浄化がいかに物議を醸しているかを示すのに十分だ。
顺便電影:電影の企画のストーリー情主讲述了 is_a() 与 is_subclass_of() 放棄されました;ArrayIterator 中国际计计却来是電影是電影、SplFileObject のCSV手法、不完全 session_set_save_handler() 同様に達成します。
4. リリースタグ
readonly 関数名(39票对1票)としては、is 与 let 識別子としてnamespace クラスとして _ 例によって、常に最終的に使用されます。 エンジンは予備にあります—特に is、将来のモデルと互換性があります
これらは現在、修理費が非常に安く済みますが、将来的には間違いです。注記 in、out、inout そして _() これは gettext 别名曾被提议作电视但必否决,従って移動したくない。
5. mb_ereg* はすでに入力されています
鬼車——mbstring的 mb_ereg システムの名前のない本物の自動車 — すでに 2025 年 4 月 24 日にアップされています。 PHP の応答は次のとおりです。8.90 です。
使用中の場合 mb_ereg()、mb_eregi()、mb_ereg_replace()、mb_regex_encoding() そしてその同族機能、これがこのバージョンの唯一の本当の移植プロジェクトです。 u 修正済み preg_*十分な予算を設定する必要があります。これは移行の言語であり、重複した名前ではありません。 2 つのエンジンは十分に詳細であるため、2 つのエンジンは対立しているため、各移行はテストと互換性のあるモードになります。 Drupal 問題はすでにこの問題を解決しており、ある程度の普遍性を示しています。
6. 続きを読む
これらの変更はテスト キットを通過し、その後実稼働環境で問題が発生します。
セキュリティを考慮して、INI セッションのデフォルト値が変更されました。session.use_strict_mode=1、session.cookie_httponly=1、session.cookie_samesite="Lax"これは良い変更ですが、それでも一部の人々のデプロイメントを破壊する必要があります。跨站 POST フローとコメント Cookie JavaScript が動作しなくなります。 php.ini 中月式は以三顶、アップグレードプロセスを裏で変更することはできません、変更した後は再び意識を地谂惌にします
単純に列挙した人もいます。
- から
__construct()または__destruct()画像価値は放棄されました。finally哝中も同様に返します (39 票对 3 票、正老用 RFC 中票数最流殊的一个)。 trim()、ltrim()、rtrim()与chop()今ではデフォルトです\f)。- これは、発行電子効果の発行会議です。次のことが可能です。
array_filter()の$modeGMPpcntl_alarm()/pcntl_exec()、Phar::mungServer()、ループのCURLOPT_READFUNCTION戻り値、国際タイムゾーンを文字列化できません、SimpleXMLElementセッション Cookie 設定の NUL バイト。 preg_grep()さあ、戻ってくださいfalse,配列の一部ではありません。- DOM の使用可能な属性の使用
public private(set)——一緒に書いたんですが、失敗しました。 - 在
__isset()物性が固まってから、??与empty()もうトリガーしません__get()。
7. ツールを完成させます
Rector の PHP_86 電子写真集、最高の電子写真の PHPStan または Psalm を使用できます composer why 学長は注意深く読んでおり、実際の考えは第 5 章と第 6 章に集中しています。
推定: 8.4 以降を実行し、完全な Laravel または Symfony アプリケーションをテストするには、半日から 1 日かかります。そのほとんどは、独自のコードを変更するのではなく、依存する更新を待っています。 mb_ereg、テストの歴史的なレガシー コード ライブラリが欠落している場合は、まったく別のトピックになります。
総合評価
PHP 8.6 は小さいバージョンですが、大きいバージョンでもあります。
新しいコンテンツ 不多だが微得当:1 つの優れた言語機能、8.5 の初期作業が完了、2 つの優れた設計カテゴリ、より良いエラー情報、および自由なパフォーマンスの向上。ここでは書き換えを強制されるものは何もなく、また設計エラーに属するものは何もありません。
例外は実際のコンテンツであり、ロードマップとしては非常に明確です。
したがって、本周就做那件枯事:用 error_reporting=E_ALL ベータ版ではテスト キットを実行すると、その番号は破棄されます。この数字は、今回が初めてであることを示している可能性があります。
PHP 8.6 は PHP 9.0 のバージョンにすぎません