PHP7.4の変更点

はじめに

こんにちは。
GMOアドマーケティングのKONCEです。

定期的にPHPバージョンアップ調査を行うのが恒例となってきました。
今回はPHP7.4のマイグレーションに関して掻い摘んで紹介します。

過去記事はこちら↓

はじめにこんにちは。GMOアドマーケティングのK.Kです。前回のPHP7.2の記事に引き続き、今回はPHP7.3の変更点に関して掻い摘んでご紹介させて頂きます。(引用元|https://secure.php.net/download-logos.php)目次PHP7.3に関して新機能2-1. 関数の引数の末尾にコンマを許可新しく追加された関数3-1. array_key_first(), array_key_last()3-2. hrtime()3-3. is_countable()下位互換性のない変更点, 推奨されなくなる機能4-1. フレキシブルなヒアドキュメント4-2. switch構文内でのcontinue4-3. 大文字と小文字を区別しない定数4-4. 文...

このエントリーは、GMOアドマーケティング Advent Calendar 2018 の 【12/2】 の記事です。GMOアドマーケティングとしては初のAdvent Calendar参戦です。はじめにこんにちは。18年新卒で入社いたしました、GMOアドマーケティングのK.Kです。新卒研修を終え、現在はゴリゴリ業務に取り組んでいます。今回の記事では、弊社のプロジェクトGMOSSPのPHPのバージョンを、PHP7.0からPHP 7.2にバージョンアップしましたので、バージョンアップの際の対応内容に関してご紹介させていただきます。(引用元|https://secure.php.net/download-logo...

php
(引用元|https://secure.php.net/download-logos.php


目次

  1. PHP7.4に関して
  2. 新機能
    2-1. 型付きプロパティ
    2-2. アロー関数
    2-3. Nullの場合の代入演算子
    2-4. 配列内での値のアンパック
  3. 下位互換性のない変更点
    3-1. 配列でない値を配列スタイルでアクセスした場合
    3-2. get_declared_classes()関数
    3-3. fnキーワード
    3-4. ファイルの最後の <?php タグ
    3-5. パスワードアルゴリズムの定数
    3-6. htmlentities()関数
  4. 推奨されなくなる機能
    4-1. 明示的に括弧で囲わずに三項演算子をネストする
    4-2. 波括弧を使った、配列や文字列のオフセットへのアクセス
    4-3. (real) によるキャストと is_real() 関数
    4-4. 親クラスがない場合における parent キーワードの利用
    4-5. Implode 関数の、歴史的なパラメータ順序
  5. 最後に

PHP7.4に関して

PHP Version 7.4.0は2019年11月28日にリリースされました。
執筆日時点ではVersion 7.4.3までリリースされており、いくつかのバグフィックスがなされているようです。
プロパティ型指定が今回の変更のメインのようです。
その他下位互換性のない変更点, 推奨されなくなる機能に関しても前回同様バージョンでの挙動の差異を見ていければと思います。


新機能

型付きプロパティ

クラスのプロパティは、新たに型宣言をサポートするようになりました。
$user->id には integer の 値だけを、そして $user->name には string の値だけを代入できるように強制します。
と、公式にはありますが、厳密にはstrict_typesを指定しないと自動型変換の影響を受けるようです。

アロー関数

ちょっとした関数を記述するのが楽になります。

Nullの場合の代入演算子

変数がnull、未定義の際演算子「??=」の後ろの値になります。
手っ取り早く初期化が行えそうです。

配列内での値のアンパック

可変長引数などで使用できた引数アンパックですが、配列内でも使えるようになり、array_mergeを使用しなくても手っ取り早く配列を結合できそうです。


下位互換性のない変更点

配列でない値を配列スタイルでアクセスした場合

null, bool, int, float, resource型の変数に対して、配列としてアクセスしようとするとエラーが発生します。

get_declared_classes()関数

定義済のクラスの名前を配列として返す関数get_declared_classes()が、インスタンス化されていない無名クラスを返さなくなります。

fnキーワード

上記新機能アロー関数に伴い「fn」が予約語となり、関数名、クラス名として使用できなくなります。

ファイルの最後の <?php タグ

ファイル最終行に改行がない場合でも <?php が開始タグとして解釈されるようになります。これまでは文字列として解釈されていました。
7.3環境では <?php と出力されます。開始タグだけのファイル用意したことないけど。

パスワードアルゴリズムの定数

パスワードハッシュのアルゴリズムの識別子の定数が、数値型からnullableな文字列型に変更になっています。

htmlentities()関数

htmlentities()関数がUTF-8以外のマルチバイトエンコーディングでは、基本的なエンティティの置換のみがサポートしているエンコーディングで使われた場合、E_NOTICEを発生するようになります。


推奨されなくなる機能

明示的に括弧で囲わずに三項演算子をネストする

三項演算子の記述を一意にしないとdeprecatedが発生するようになりました。ややこしい書き方すんなって僕でも思います。

波括弧を使った、配列や文字列のオフセットへのアクセス

{}を使用しての配列や文字列にアクセスするとdeprecatedが発生するようになりました。これまでは出ていませんでした。

(real) によるキャストと is_real() 関数

(real)によるキャスト、is_float()関数のエイリアスis_real()関数が共にdeprecatedが発生するようになりました。

親クラスがない場合における parent キーワードの利用

メソッドの呼び出し有無に関わらず、親クラスがない場合にparentキーワードを利用すると、deprecatedが発生するようになりました。
以前の環境でも呼び出せばエラーが発生していました。

Implode 関数の、歴史的なパラメータ順序

配列要素を文字列により連結するimplode()関数では引数の順番を変更しても動作する状況でしたが、PHP7.4でdeprecatedが発生するようになりました。
コーディングルールが一つ減ったくらいの感覚です。


最後に

執筆する際毎度のように同じような感想になってしまいますが、今回のPHP7.4は型付きプロパティなど試したい新機能もあり、調査を行ってよかったと思えました。
今後もPHPの情報をキャッチアップして、発信できていければと思います。

GMOアドマーケティングではエンジニアを募集しています。
興味がある方は以下のページをご覧ください。

■エンジニア採用ページ ~福利厚生や各種制度のご案内はこちら~