RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

PHP8.1 新機能 まとめ【初心者向け】

みなさん、初めましてmrstsgk_rksです。
今回は、私が開発時に使用している言語「PHP」についてまとめました。
最初にPHP8.0の新機能について振り返り、PHP8.1の新機能についてもまとめたいと思います。
PHP8.1の新機能に関しては、リリース日が近づいてきたため、本記事に再度まとめさせていただきました。
最後までお読みいただけましたら幸いです。

目次

PHPについて

PHPの概要

PHPは動的型付け言語

動的型付け言語とは、事前にコンパイルを行わず、プログラムの実行時に型をチェックします。
メリットとしては、プログラムの書く量が少なく直感的にコードを書けます。
PHPの他には、JavaScriptPythonなどが該当します。
一方、Javaのような静的型付け言語などよりも処理が遅いというデメリットもあります。

PHPは初心者向け

理由1. HTMLとの親和性が強い

PHPは、もともと動的にウェブページを作成するために作成された言語であり、
PHPHTMLに直接書き込むことが可能です。
なので、HTMLから学習を始めた方にとっては、PHPは慣れ親しみやすい言語になると思います。

理由2. 開発環境が整っている

PHPを実行するには動作環境が必要ですが、PHPには環境構築ツールが用意されているので
簡単にPHPの動作環境を用意することが可能です。

・主な環境構築ツール
 1. XAMPP
  PHPの動作環境を作成する際に真っ先にあがるツールとして、XAMPPがあります。
  XAMPPは、クロスプラットフォームであり「Windows」、「Linux」、「macOS」などどのOSでも、動作   させることが可能です。
  しかし、macOSの場合は以下で紹介する「MAMP」が使用されることが多いです。

 2. MAMP
  MAMPもXAMPPと同様に環境開発ツールですが、XAMPPに比べてmacOSに特化していることが違いです。

理由3. WordPressのカスタマイズが可能

WordPressはブログやWebサイトを構築する際に利用するソフトウェアのことです。
WordPressのようなソフトウェアのことをCMSコンテンツマネジメントシステム)と呼び、WordPressは世界で最も多く利用されているCMSです。

PHPができるとWordPressをカスタマイズすることが可能です。
PHPはWebアプリケーション以外にもWordPressをカスタマイズできるので他の言語に比べて、PHPでできることは多いと思います。

以上の3つの理由からPHPは初心者向けと言えるでしょう。

PHP8.0 新機能

PHP8の新機能で私が気になったものをまとめます。

ユニオン型(UnionTypes)

ユニオン型(UnionTypes)は2つ以上の型をパイプ記号(|)でつなげて書きます。
PHP8以前のバージョンでは、「パラメータ」や「戻り値」、「プロパティ」の型に対して、単一の型宣言しかできませんでした。またPHP8以前のバージョンでは次の例のように、ユニオン型は「PHPDoc」の注釈でのみ指定することが可能でした。

class Hoge {
 /**
  * @var int|float $hoge
  */
 private $hoge;

 /**
 * @param int|float $hoge
 */
 public function setHoge($hoge) {
  $this->hoge = $hoge;
 }
}

そして、PHP8ではユニオン型をパイプ記号でつないでT1|T2|...で書けるようになりました。
(下記の例を参照)

class Hoge {
    private int|float $hoge;

    public function setHoge(int|float $hoge): void {
        $this->hoge = $hoge;
    }
}

PHP8からユニオン型を利用することにより、PHPDocに頼らず多くの情報を関数に定義できます。

ユニオン型のメリット

  • 型をしっかりと適用できるので、ミスを早期に発見できる
  • PHPDocの分量を減らすことできる など

PHP8で追加されたユニオン型にはメリットばかりあるように感じますが、注意点もあります。

ユニオン型の注意点

  • voidはユニオン型の一部として使用できない
     voidは関数が値を返さないことを意味するので、int|voidのように使用できません。

  • null許容型(nullable)について
     PHP8以前のPHP7.1からサポートされたnull許容型ですが、
     ユニオン型と混合して?int|floatなどと使用できず、正しくはint|float|null
     と書くことができます。以下にnull許容型の例を記載します。

public function huga (?int $huga) {
 ・・・
}

$hugaでは、int値を指定する、nullを指定する、省略するの3つのどれかを許容できます。

  • false疑似型について
     PHPの関数の多くが、失敗時の戻り値にfalseが設定されている関数が多いので、
     false疑似型もサポートされています。
     また、null単独ではユニオン型で使うことができませんが、false|nullと使用することも可能です。

JIT

JITとは、Just-In-Timeの略で、プログラム実行時に事前に用意しておいたコードを保持し、そのコードを使いまわすことで、実効速度などの向上を狙う仕組みのことです。

PHPの概要でも説明しましたが、PHPは実行時にコンパイルします。
そこでJITでは、リクエストが来たソースコードを読み込み、PHPを一気にネイティブコードにコンパイルし、さらにコンパイルした結果を次のリクエストに使いまわすことが可能なので、大幅なパフォーマンスの向上が期待できます。

JITコンパイラのメリット

  • PHPアプリケーションコードのパフォーマンス向上 など

JITコンパイラのデメリット

  • WordPressのパフォーマンスに大きな改善をもたらすことはない
  • 複雑性が増すのでデバックやメンテナンスのコストが増加する可能性がある など

名前付き引数

PHP8新機能紹介の最後は、名前付き引数です。

名前付き引数を使用すると、パラメータの場所ではなく、パラメータ名が参照され関数に引数を渡すことができます。関数に名前付き引数を渡すには、その値の前にパラメータ名を加えるだけです。

function sample($testNum1 = 1, $testNum2 = 4) {
 ・・・
}

また、以下のようなコードはNGです。

function NGSample($testNum1 = $value1, $testNum2 = $value2) {
 ・・・
}

NGsample関数のコードでは、パラメータ名を動的に渡すことができないことを意味しています。

名前付き引数をのメリット

名前付き引数に関しては、メリットのみ記述します。
メリットとして考えられるのは、関数の呼び出しが楽になったということでしょうか。

PHP8以前は、引数の順番を知らないと引数が何を表しているのかがわかりずらかったのですが、PHP8以降はパラメータに名前を使えることによって可読性の向上が期待できます。

PHP8.1 新機能

PHP8.1の新機能で私が気になったものをまとめます。

列挙型(Enum

PHP8.1でついに列挙型が追加されました。

enum Suit {
  case Hearts;
  case Diamonds;
  case Clubs;
  case Spades;
}

$val = Suit::Hearts;

列挙型とは、複数の定数をひとまとめにできる型のことです。列挙型を使用することで、同グループの定数をひとまとめにすることができるので、ソースコードの可読性が向上するでしょう。

また、上の例であるSuit列挙型Suit::Heartsと書くことによって値にアクセスすることが可能です。

交差型(Intersection Types)

PHP8で追加されたユニオン型が型の和集合(または)を表しますが、PHP8.1で追加された交差型は、型の積集合(かつ)を表します。なので交差型&でつなげて表現します。

class Hoge {
 /**
 * 交差型 $hogeはHogeかつFugaである
 */
 private Hoge&Fuga $hoge;
}

戻り値の型never

PHP8.1から関数の処理を戻さないことを指定できる戻り値の型neverが追加されます。

function redirect(): never {
    exit();
}

PHP8.1から追加されるneverは、既存の戻り値の型であるvoidと「関数やメソッドが値を返さないことを保証」することに関しては、似ていますがvoidが宣言された関数は、明示的な値がなくても返すことができるのに対し、neverが宣言された関数では同じことはできません。

つまり、関数を呼び出した後もPHPの実行が続くことを期待する時はvoidを使用し、その逆の場合はneverを使用します。

finalクラス定数

定数をfinalとして宣言すると定数の値を上書きされないことを保証します。

class Huga {
 final public const H = "Huga";
}

クラス、メソッド、定数にfinalを定義できますが、プロパティには定義できないので注意が必要です。

readonlyプロパティ

PHP8.1新機能紹介の最後は、readonlyプロパティです。

PHP8.1から追加されるreadonlyプロパティですが、上で紹介したfinalクラス定数がプロパティには定義できないという注意点を補完してくれる便利なプロパティです。
readonlyプロパティは一度初期化した後は、値が変更できない変数を作成できます。

class Test {
    public readonly string $sampleWord;
 
    public function __construct(string $sampleWord) {
        $this->sampleWord = $sampleWord;
    }
}

$test = new Test("hoge");

var_dump($test->sampleWord); // "hoge"

$test->sampleWord = "fuga"; // Error

上の例では、変数$sampleWordreadonlyプロパティが指定されています。
コンストラクタでこの変数に初期値が代入されるので、”hoge”を指定してオブジェクトを作成することにより、readonlyプロパティを指定した変数$sampleWordにその値が代入されます。

しかし変数に値を代入しようとすると、初期化時ではないためエラーを発生します。

最後に

いかがでしたでしょうか。
PHP8とPHP8.1の新機能を一部紹介いたしました。
PHP8とPHP8.1には、まだまだ多くの新機能が追加されていますので、ぜひほかの新機能も調べてみてください。
まずは、この記事を通してPHPに少しでも興味を持っていただければ幸いです。
ご覧いただきありがとうございました。

おすすめの関連ブログ

PHPに関連する内容で、別途ブログを作成しております。
是非、ご参考ください!

◆関連ブログ
PHP カンファレンス 2021【参加レポート】
PHP8.1 の新機能について語り合う・前編【PHP TechCafe イベントレポート】
PHP8.1 の新機能について語り合う・後編【PHP TechCafe イベントレポート】

参考文献

PHP 8の新機能(新機能、改善点、およびJITコンパイラー)
【PHP8.0】PHP8.0の新機能
PHP 8.1の新機能:機能、変更、改善など
【PHP8.1】PHP8.1の新機能


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.