(jp) =
PHP 7.4 は、PHP の最新の安定バージョンです。 これは 2019 年 11 月 28 日にリリースされたもので、PHP 8 より前の最後のバージョンです。多くの新機能、構文の追加、および修正が行われています。 この投稿では、アップグレードの準備に役立つすべての新機能と変更された機能のリストを見つけることができます。 PHP 7.4 に含まれているいくつかのハイライトから始めましょう。
# 新機能
PHP 7.4 には、驚くほど多くの新機能が搭載されています。 すべての新機能のリストから始めて、変更点と非推奨事項を見ていきます。
ただし、本題に入る前に注意してください。まだ PHP の以前のバージョンを使用している場合は、PHP 7.3 の新機能も参照してください。
# アロー関数 RFC
「短いクロージャー」とも呼ばれるアロー関数を使用すると、冗長性の低いワンライナー関数を使用できます。
あなたは以前にこれを書いていましたが:
array_map(function (User $user)
return $user->id;
, $users)
これで次のように記述できます。
array_map(fn (User $user) => $user->id, $users)
アロー関数については、いくつかの注意事項があります。
- 彼らはいつでも親スコープにアクセスできます。
use
キーワード。 -
$this
通常のクロージャーと同じように利用できます。 - アロー関数には、return ステートメントでもある式を 1 つだけ含めることができます。
それらについては、こちらで詳しく読むことができます。
# 型付きプロパティ RFC
クラス変数は型ヒントを与えることができます:
class A
public string $name;
public ?Foo $foo;
この機能については伝えたいことがたくさんあるので、それらについての専用の記事を書きました。
# 型分散の改善 RFC
過去に PHP の型システムについても書いたので、実際に PHP のコアにいくつかの改良が加えられているのを見るのは良いことです。
型分散は、独自のブログ投稿に値する別のトピックですが、要するに: 共変の戻り型を使用できるようになります –
class ParentType
class ChildType extends ParentType
class A
public function covariantReturnTypes(): ParentType
class B extends A
public function covariantReturnTypes(): ChildType
– および反変の引数。
class A
public function contraVariantArguments(ChildType $type)
class B extends A
public function contraVariantArguments(ParentType $type)
# Null合体代入演算子 RFC
次は、null 合体代入演算子で、null 合体操作の省略形です。 これを行う代わりに:
$data['date'] = $data['date'] ?? new DateTime();
あなたはこれを行うことができます:
$data['date'] ??= new DateTime();
この演算子の詳細については、PHP ショートハンドに関する私の投稿を参照してください。
# 配列拡散演算子 RFC
次に、スプレッド演算子を配列で使用できるようになりました。
$arrayA = [1, 2, 3];
$arrayB = [4, 5];
$result = [0, ...$arrayA, ...$arrayB, 6 ,7];
これは、数値キーを持つ配列でのみ機能することに注意してください。PHP 8.1 以降では、文字列キーを持つ配列をアンパックすることもできます。
# 数値リテラル セパレータ RFC
PHP 7.4 では、下線を使用して数値を視覚的に区切ることができます。 次のようになります。
$unformattedNumber = 107925284.88;
$formattedNumber = 107_925_284.88;
アンダースコアは、エンジンによって単純に無視されます。
# 外部関数インターフェース RFC
いくつかのコアレベルの機能に移りましょう。外部関数インターフェイスまたは略して「FFI」は、ユーザーランドから C コードを呼び出すことを可能にします。 これは、PHP 拡張機能を純粋な PHP で記述し、composer を介してロードできることを意味します。
ただし、これは複雑なトピックであることに注意してください。 この機能を適切に使用するには、C の知識が必要です。
# プリロード RFC
もう 1 つの下位レベルの機能は、プリロードです。 これは、PHP のコアへの驚くべき追加機能であり、パフォーマンスが大幅に向上する可能性があります。
要するに、フレームワークを使用している場合、そのファイルはリクエストごとにロードおよびリンクする必要があります。 プリロードにより、サーバーは起動時に PHP ファイルをメモリにロードし、後続のすべてのリクエストで永続的に利用できるようにします。
もちろん、パフォーマンスの向上にはコストが伴います。プリロードされたファイルのソースが変更された場合、サーバーを再起動する必要があります。
もっと知りたいですか? プリロードの設定と使用に関する専用の投稿を書き、いくつかのプリロード ベンチマークも行いました。
# カスタム オブジェクトのシリアル化 RFC
2 つの新しいマジック メソッドが追加されました。 __serialize
と __unserialize
. これらの方法との違いは __sleep
と __wakeup
RFC で議論されています。
# 参考までに反省 RFC
Symfony の var dumper のようなライブラリは、リフレクション API に大きく依存して変数を確実にダンプします。 以前は、参照を適切に反映することができなかったため、これらのライブラリはそれらを検出するためにハックに依存していました。
PHP 7.4 では、 ReflectionReference
この問題を解決するクラス。
# 弱参照 RFC
弱い参照はオブジェクトへの参照であり、オブジェクトの破壊を妨げません。
# mb_str_split
追加した RFC
この関数は、 str_split
、ただしマルチバイト文字列では。
# パスワードハッシュレジストリ RFC
ユーザーランドがより簡単に使用できるように、ハッシュ ライブラリの使用方法に内部的な変更が加えられました。
具体的には、新機能 password_algos
登録されているすべてのパスワード アルゴリズムのリストを返す が追加されました。
RFC はその利点について少し不明確でしたが、幸運にも Sara はもう少し背景を説明することができました:
これは、ext/sodium (または実際には誰でも) がパスワード ハッシュ アルゴリズムを動的に登録できることを意味します。 その結果、今後 Argon2i と Argon2id がより一般的に利用できるようになります。
# 変更と非推奨
新しい機能に加えて、言語にも多くの変更があります。 これらの変更のほとんどは互換性を損なうものではありませんが、一部はコード ベースに影響を与える可能性があります。
非推奨の警告は、定義によると「破壊的」ではなく、将来的に機能が削除または変更されることを開発者に通知するだけであることに注意してください。 非推奨の警告を無視せず、すぐに修正することをお勧めします。 PHP 8.0 へのアップグレード パスがより簡単になるためです。
# 左結合三項演算子の非推奨 RFC
三項演算子には、PHP の奇妙な癖があります。 この RFC は、ネストされた 3 項ステートメントに対する非推奨の警告を追加します。 PHP 8 では、この非推奨はコンパイル時エラーに変換されます。
1 ? 2 : 3 ? 4 : 5;
(1 ? 2 : 3) ? 4 : 5;
# 許可される例外 __toString
RFC
以前は、例外をスローできませんでした __toString
. 一部の古いコアエラー処理メカニズムの回避策のために禁止されていましたが、Nikita 氏は、この「解決策」は対処しようとした問題を実際には解決していないと指摘しました。
この動作が変更され、例外をスローできるようになりました。 __toString
.
# 連結の優先順位 RFC
次のように書くとします。
echo "sum: " . $a + $b;
PHP は、以前は次のように解釈していました。
echo ("sum: " . $a) + $b;
PHP 8 では、次のように解釈されるようになります。
echo "sum: " . ($a + $b);
PHP 7.4 では、括弧で囲まれていない式に .
前に +
また -
サイン。
# array_merge
引数なし アップグレード
スプレッド演算子が追加されたので、使いたい場合があるかもしれません array_merge
そのようです:
$merged = array_merge(...$arrayOfArrays);
エッジケースをサポートするには $arrayOfArrays
両方とも空になります array_merge
と array_merge_recursive
空のパラメーター リストを許可するようになりました。 入力が渡されなかった場合、空の配列が返されます。
# 配列および文字列アクセス用の中括弧 RFC
中かっこを使用して、配列と文字列オフセットにアクセスすることができました。
$array1;
$string3;
これは廃止されました。
# 無効配列アクセス通知 RFC
たとえば、整数に対して配列アクセス構文を使用するとします。 PHP は以前は返されていました null
. PHP 7.4 以降、通知が発行されます。
$i = 1;
$i[0];
# proc_open
改善 アップグレード
に変更が加えられました proc_open
シェルを介さずにプログラムを実行できるようにします。 これは、コマンドの文字列の代わりに配列を渡すことによって行われます。
# strip_tags
配列も受け入れます アップグレード
以前は、次のように複数のタグを削除することしかできませんでした:
strip_tags($string, '<a><p>')
PHP 7.4 では配列も使用できます。
strip_tags($string, ['a', 'p'])
# ext-hash
常に有効 RFC
この拡張機能は、すべての PHP インストールで永続的に利用できるようになりました。
# PEAR はデフォルトでは有効になっていません 外観
PEAR はもはや積極的に保守されていないため、コア チームは PHP 7.4 でデフォルトのインストールを削除することを決定しました。
# いくつかの小さな非推奨 RFC
この RFC には、それぞれに独自の投票がある、多くの小さな廃止予定がバンドルされています。 RFCページのより詳細な説明を必ず読んでください。ただし、非推奨のもののリストは次のとおりです。
- の
real
タイプ - 魔法の引用符の遺産
-
array_key_exists()
オブジェクト付き -
FILTER_SANITIZE_MAGIC_QUOTES
フィルター - 反射
export()
メソッド -
mb_strrpos()
第 3 引数としてエンコーディングを使用 -
implode()
パラメータオーダーミックス - バインド解除
$this
非静的クロージャから -
hebrevc()
関数 -
convert_cyr_string()
関数 -
money_format()
関数 -
ezmlm_hash()
関数 -
restore_include_path()
関数 -
allow_url_include
ini ディレクティブ
# その他の変更 アップグレード
PHP のバージョンをアップグレードするときは、UPGRADING ドキュメント全体を常に確認する必要があります。
以下にいくつかの変更点を示します。
- 通話中
parent::
親のないクラスでは非推奨です。 - 通話中
var_dump
上にDateTime
またDateTimeImmutable
インスタンスは、オブジェクトにアクセス可能なプロパティを残しません。 -
openssl_random_pseudo_bytes
エラー状況で例外をスローします。 - をシリアル化しようとしています
PDO
またPDOStatement
インスタンスはException
の代わりにPDOException
. - 通話中
get_object_vars()
上でArrayObject
インスタンスはのプロパティを返しますArrayObject
ラップされた配列またはオブジェクトの値ではありません。 ご了承ください(array)
キャストは影響を受けません。 -
ext/wwdx
廃止されました。
# RFC 投票プロセスの改善
これは技術的には PHP 7.4 に関連する更新ではありませんが、言及する価値はあります: RFC の投票規則が変更されました。
- 合格するには、常に 2/3 の多数決が必要です。
- これ以上短い投票期間はありません。すべての RFC は少なくとも 2 週間開いている必要があります。