PHP 8.1とは何か?
PHP 8.1とは何かについてまずは解説します。そもそもPHPはどのような言語なのか、従来のPHPとPHP 8.1は何が違うのか詳しくみていきましょう。
PHPとは?
PHPはWebアプリ開発に使われるインタープリタ型のプログラミング言語です。プログラミング未経験者でも使いやすい言語として有名であり、多くのプログラミングスクールでは初心者にPHPを学ばせています。一方、他の言語の経験がある上級者からは「処理が遅い」「使いにくい」と言われることも多い言語でした。
しかしPHPは何度もアップデートを重ねており徐々に機能が改善されていったので、今ではそういった意見はほとんど聞かなくなりました。今後PHPはWebアプリ言語としてさらに伸びていくと推測されます。
PHP 8.1は従来と何が違う?
PHP 8.1は、2021年11月25日にリリースされたPHPの新バージョンのことです。PHP 8.1ではSymfonyのデモアプリケーションで23%の高速化を実現し、更にWordpressで3.5%の高性能化を実現しました。更に、非同期処理の簡略化やEnum型の追加などソースコードの可読性アップに貢献する多くの機能が追加されました。
PHP 8.1の新機能
PHP 8.1には従来のPHPにはない機能がいくつか追加されています。開発現場でPHPを扱う方はこれらの新機能について知っておくべきでしょう。ここではPHP 8.1の新機能の一部を紹介します。
【参考】:PHP: 新機能 - Manual
Fibers導入による非同期処理の簡略化
PHP 8.1にはFibersという非同期処理を行う仕組みが導入されました。非同期処理とは1つのタスクを実行している際に他の複数のタスクを実行できる方式のことで、活用することで実行時間を短縮することが可能です。たとえば、スクレイピングする際にHTTPリクエストを複数サイトに同時に投げ、まとめてデータを取得することができます。
PHPでは今まで非同期処理を行うことが難しく、exec関数を使って類似的に行うなどが主流でした。今回Fibersが導入され、非同期処理をPHPでも簡単に書くことができるようになりました。
Enum型の追加
Enum型が追加されたのも大きな変更点と言って良いでしょう。Enum型はPythonなどにはありますが、PHPにはこれまで搭載されていませんでした。これまで実装を長らく試みていたのですがなかなか実現されず、今回満を持しての実装となります。Enum型を使うことで、以下のように定数をまとめて定義することができコードの可読性が上がります。
enum Phone
{
case OFFICE;
case HOME;
case SCHOOL;
case STATION;
}
print(Phone::OFFICE);
8進数の整数リテラルのプレフィックス指定
PHP 8.1で「8進数の整数リテラルのプレフィックス指定」が可能になりました。今まではコード上で8進数を書く場合このようになりました。
<?php
$num = 010; // 8進数の8
?>
ただ、この書き方では分かりづらさがありました。今回の改良で明示的に0oや0Oを指定可能になっています。
<?php
$num = 0o10; // 8進数の8
?>
これまでも16進数などはプレフィックス指定が可能で、8進数だけが不可能だったのですが、今回で改善されました。
文字列をキーの場合にもアンパックが可能
「アンパック」とはリストやタプルなど複数の要素を持つものを分解し、他の変数に代入することです。アンパック機能を使うことで配列同士のマージができるようになります。
$arr1 = [1 => 1, 2];
$arr2 = [1 => 3, 4];
$array = [...$arr1, ...$arr2];
上記のようにキーが数値の場合はアンパック可能でしたが、キーが文字列の場合はこれまでできず、PHP 8.1にてできるようになりました。たとえば以下のような記述が可能です。
$arr1 = ['num1' => 1, 2];
$arr2 = ['num2' => 3, 4];
$array = [...$arr1, ...$arr2];
CURLStringFileクラスが追加
PHP 8.1で新しく「CURLStringFileクラス」が追加されました。CURLStringFileを使うとファイルのアップロードを変数を使って直接行えるようになります。
<?php
$TestFile = new CURLStringFile($data, 'test.txt', 'text/plain');
curl_setopt($curl, CURLOPT_POSTFIELDS, ['file' => TestFile]);
?>
PHP 8.1から推奨されなくなる機能
続いて、PHP 8.1から推奨されなくなる機能について解説します。PHP 8.1にアップデートされたことで、今まであまり使われていなかった機能や、使用することでトラブルの種になりがちな機能が非推奨になりました。PHP 8.1で非推奨になった機能はPHP9では削除されて使えなくなります。そのため、PHPを活用している企業は今のうちに非推奨の機能を使っているコードを書き換える必要があります。
【参考】:PHP: PHP 8.1.x で推奨されなくなる機能 - Manual
date_sunsetとdate_sunriseの使用
「date_sunset」と「date_sunrise」という関数がPHPにはありますが、これら2つは非推奨になります。date_sunsetは指定した日付および場所についての日の入り時刻を返し、date_sunriseは指定した日付および場所についての日の出時刻を返す関数です。
PHP 8.1では新しく「date_sun_info関数」が登場します。date_sun_info関数は日の出・日の入り時刻を含めた日時情報を総合的に取得できる関数なので、PHP 8.1以降はこちらを使うことが推奨されています。
floatからintへの強制変換
「float」から「int」への強制変換は非推奨となりました。強制変換すると値が勝手に変わってしまいトラブルの種になるためです。たとえば、下記のように配列のキーにfloatを使うと自動的にint型になりますが、このような書き方は非推奨となります。
<?php
$arr = [2.5];
?>
PgSQLに接続リソースを渡さない
「pg_query」などの関数に接続リソースを渡さないのも非推奨になります。pg_queryはクエリを実行する関数ですが、今までは下記のようにデータベースを指定しなくても動かすことが可能でした。
<?php
pg_query($query);
?>
今後はきちんと下記のようにデータベースを指定する必要があります。
<?php
pg_query($cnctn, $query);
?>
ctype関数に文字列以外を渡す
「ctype関数」は引数に文字列を指定することで文字列の状態を判定するものです。たとえば、ctype_alnum関数は指定した文字列が英数字がどうか調べることができ、ctype_digitは数字がどうか調べることができます。
今まではctype関数に数値も渡すことが可能でした。数値を渡した場合、文字列ではなくASCII値として認識されます。たとえば、ctype_digit("10")と書くとTrueを返しますが、ctype_digit(10)だと「10」がASCII値になるためFalseを返します。
整数型と文字列型で挙動が異なるのは良くないため、int型を引数にするのは非推奨になりました。数値を引数とする場合は、必ず文字列にキャストする必要があります。
objectに対してkeyなどを呼び出す
keyやnext、current、prev、reset、entなどの関数は配列ポインタの操作に使える関数であり、今まではオブジェクトも受け取ることが可能でしたが、今回の改良で非推奨となりました。これらの関数を使っている箇所は確認する必要があるでしょう。
PHP 8.1の特性を把握し早めに対応を行うべき
本記事では、PHP 8.1について解説しました。PHP 8.1の新機能や非推奨となる機能がお分かり頂けたかと思います。PHP 8.1のアップデートによって一部のみ機能が変更されるので、PHPを使っているシステムが社内にある場合は、コードの書き換えが必要となる場合もあるでしょう。PHP 8.1の特性を把握し早めにコード修正のスケジュールを組むことが重要です。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから