2021/05/09
PHP8 使える新機能 6選!
PHP8が出たという事については、ある程度時間も経過した為、知っている方は多いのではないのでしょうか?
PHP7から8に変わって、新機能(変更点)がたくさんある為、その中でも使えるものを6つ紹介しようと思います。
1. JIT
これは一番有名な変更点で、OPcacheの進化版です。
ただ、私も実際に使用したことはまだ無く、どんなものかだけを簡単にご説明します。
そもそもOPcacheとは?
OPcacheとはコードをコンパイルし、共有メモリへ保存しておく仕組みのことです。
PHPはインタプリタですが、この仕組みによってリクエストごとにスクリプトを読む必要がなくなり、パフォーマンスの向上が期待されます。
https://qiita.com/morimorim/items/fb39ae7d673a8b88f413
OPcacheを使用すると、リクエスト毎にコンパイルしていたのを省略する事が出来る
という事ですね。
さらに、それの進化版となると、どう変わるの?
リクエストされた時のフローを出すと下のような感じです。
リクエスト → ソースのコンパイル(opcodeの生成) → ネイティブコードへ変換 → 実行
OPcacheでは「ソースのコンパイル(opcodeの生成)」が省略されます。
JITでは「ソースのコンパイル(opcodeの生成)」と「ネイティブコードへ変換」まで省略されます。
もう1段階の省略のために(JITを導入するのに)、膨大なコミットをしたようです。それだけ期待度が高いと言えます。
使える環境下なら是非使いたい所ですね。
2. 関数呼び出し側の引数末尾カンマOK
何を言っているのか分からないかもしれませんが、下のサンプルコードを見て下さい。
function action($a, $b) {
return $a + $b;
}
echo action(1, 2, ); // ←2の後ろのカンマOK
関数を呼び出す時に、第3引数が存在しないのにカンマを入れれるようになりました。
下の様に配列の記述と良く似た書き方が出来るという事ですね。
// 配列
$arr = [1, 2, ];
// 関数
action(1, 2, );
実はPHP8からではなく、PHP7.3からなのですが……..ご容赦ください!
3. 関数側の引数末尾カンマOK
これは「関数呼び出し側の引数末尾カンマOK」と非常に似ています。
違うのは今度は関数側なだけですね。
ではサンプルコードを見てみましょう。
function action($a, $b, ) { // ←$bの後ろのカンマOK
return $a + $b;
}
echo action(1, 2);
もう説明は不要ですよね?……
4. 引数でmixed型の指定
関数を記述する時に型の指定が出来ることは知っている人が多いと思います。
型で有名なのは下のものですね。
- int
- string
- bool
- array
その型の中でもmixedといって、intでもstringでも何でもOKという型です!
実際にサンプルコードを見てみましょう。
NGパターン
function sampleEcho(string $value) {
echo 'サンプルechoの結果は'.$value;
}
sampleEcho('123'); //成功
sampleEcho(123); // エラー
OKパターン
function sampleEcho(mixed $value) { // ←mixed型指定!
echo 'サンプルechoの結果は'.$value;
}
sampleEcho('123'); // 成功
sampleEcho(123); // 成功
見ての通り、型の指定をすると、文字列の123 と 数値の123は別々に扱われますが
mixedにすると何でも許容するので配列(Array)でも数値でも文字でも使えます。
5. str_contains
これは新しい関数になります。
「文字列の中に特定の文字が含まれるか判定する」といったものになります。
PHPをずっと使っていた人なら、こう思ったことはあるのではないでしょうか?
ナンデこの関数ないの?!
サンプルコードを見てみましょう。
今までのやり方
if ( strpos('abcdef', 'a') !== false ) {
// 'abcdef'に'a'が見つかった時の処理
}
str_containsを使ったやり方
if ( str_contains('abcdef', 'a') ) {
// 'abcdef'に'a'が見つかった時の処理
}
正直、今更感がハンパないですね…..
6. 関数の引数の型指定を複数に
今までは関数の引数に型を指定する場合、一つしか指定出来ませんでしたが
「|」で区切る事で、型を複数指定出来る様になりました。
サンプルコードを見てましょう。
NGパターン
function sampleEcho(string $value) {
echo 'サンプルechoの結果は'.$value;
}
sampleEcho('123'); //成功
sampleEcho(123); // エラー
OKパターン
function sampleEcho(string|int $value) { // ←string型とint型を指定!
echo 'サンプルechoの結果は'.$value;
}
sampleEcho('123'); // 成功
sampleEcho(123); // 成功
ちなみにNULLも指定出来る様です。
あまり多様すると不具合の元になるので気をつけて使わないといけませんが、かなり使えるものではないでしょうか?
以上、PHP8の新機能 6選でした!
新機能はアトリビュートやら他にもかなり増えているので、詳しく知りたい方は参考にしてみて下さい。