PHP 7.1〜7.4の新機能を初心者向けに解説|nullable types・void・iterable・型付きプロパティなど




こんにちは。プロクラスの國府です。 前回の記事では、PHP 7.0で追加された機能について紹介しました。 PHP 7.0では、

  • スカラー型宣言
  • 戻り値の型宣言
  • strict_types
  • null合体演算子 ??
  • 宇宙船演算子 <=>
  • 無名クラス

などが登場しました。 今回はその続きです。 PHP 7.1、7.2、7.3、7.4では、PHPの「型をより分かりやすく書く」という方向がさらに進んでいきました。 特にPHP 7.4で追加された「型付きプロパティ」は、現在のPHPでもよく使われる機能です。 PHP 8の新機能を理解するうえでも、このあたりの流れを知っておくと分かりやすくなります。

PHP 7.1で追加された機能

 

まずはPHP 7.1です。 PHP 7.1では、PHP 7.0で導入された型指定がさらに強化されました。 ここでは特に覚えておきたいものを紹介します。

  • nullable types
  • void
  • iterable
  • 複数catch
  • クラス定数のアクセス修飾子

この中でも、初心者の方には nullable types と void が分かりやすいと思います。

 

nullable types

 

nullable typesは、「この値は指定した型、または null になる可能性があります」と明示するための機能です。 例えば、ユーザー名を返す関数を考えてみます。

function getUserName(): ?string
{
return null;
}

ここで、 ?string となっているのがポイントです。 通常の string なら文字列を返す必要があります。 一方、 ?string なら、

  • 文字列
  • null

のどちらかを返すことができます。 例えば次のようなコードです。

function getUserName(): ?string
{
if (/* ユーザーが見つかった */) {
return '山田太郎';
}
return null;
}

データベースからユーザーを検索するときなど、「見つからない場合は null を返す」という処理はよくあります。 そのような場合に、 「この関数は文字列かもしれないし、nullかもしれない」 ということをコード上で明確にできます。

 

引数にもnullable typesを使える

 

nullable typesは戻り値だけではありません。 関数の引数にも使えます。

function printUserName(?string $name): void {
if ($name === null) {
echo '名前がありません';
return;
}
echo $name;
}

この場合、$name には文字列または null を渡せます。 例えば、

printUserName('山田太郎');
printUserName(null);

という使い方ができます。 PHPで型を意識してコードを書く場合、nullable typesはかなりよく登場します。

 

void

 

PHP 7.1では、戻り値の型として void が追加されました。 void は、 「この関数は値を返しません」 という意味です。 例えば、

function showMessage(): void
{
echo 'こんにちは';
}

この関数は画面に文字を表示するだけで、値を返していません。 そのため、戻り値を void としています。 return を使うこと自体はできますが、値を返すことはできません。

function showMessage(): void
{
echo 'こんにちは';
return;
}

このように値を指定しない return は使用できます。 一方で、

function showMessage(): void
{
return 'こんにちは';
}

これは void に対して値を返しているため、エラーになります。

 

iterable

 

PHP 7.1では iterable という型も追加されました。 iterable は簡単に言うと、 「foreachで繰り返し処理できるもの」 を表す型です。 例えば配列です。

function printItems(iterable $items): void
{
foreach ($items as $item) {
echo $item;
}
}

この関数には配列を渡せます。

$items = ['PHP', 'Laravel', 'WordPress'];
printItems($items);

iterable は配列だけではなく、Traversableを実装したオブジェクトも対象になります。 このため、 「foreachで処理できるデータを受け取りたい」 という場合に便利な型です。 最初のうちは、 「配列など、foreachで繰り返し処理できるものを表す型」 くらいで覚えておけば十分です。

 

複数の例外を1つのcatchで処理する

 

PHP 7.1では、複数の例外を1つの catch で処理できるようになりました。 以前は例外ごとに catch を書く必要がありました。 PHP 7.1以降では、| を使って複数の例外を指定できます。

try {
// 処理
} catch (Exception | RuntimeException $e) {
echo 'エラーが発生しました';
}

例外処理を書くときの記述量を減らせるようになりました。

 

PHP 7.2で追加された機能

 

続いてPHP 7.2です。 PHP 7.2では、型に関する機能がさらに追加されています。 特に覚えておきたいのが object 型です。

 

object型

 

PHP 7.2では object 型が追加されました。 これは、 「オブジェクトを受け取ります」 ということを明示するための型です。 例えば、

function showObject(object $data): void
{
echo get_class($data);
}

この関数にはオブジェクトを渡します。 例えば、

$user = new stdClass();
showObject($user);

のように使えます。 object は、特定のクラスだけを指定するものではありません。 「何らかのオブジェクトであること」を指定したい場合に使います。

 

object型とクラス名による型指定の違い

 

例えば、

function showUser(User $user): void
{
// ...
}

とした場合は、User クラスのオブジェクトを受け取ることを意味します。 一方、

function showObject(object $data): void
{
// ...
}

なら、特定のクラスに限定せず、オブジェクトであれば受け取れます。 実際の開発では、必要に応じて具体的なクラス名やインターフェースを指定することも多いです。 ここでは、 object =「オブジェクトであることを型として指定できる」 と覚えておきましょう。

 

PHP 7.3で追加された機能

 

PHP 7.3では、PHPの基本的な書き方をより扱いやすくする変更がいくつか入りました。 PHP 7.0〜7.2と比べると、「これだけ覚えておけばOK」という大きな型機能は少なめです。 その中でも、文字列を複数行で書くときに使うHeredocやNowdocが改善されました。

 

Heredoc・Nowdocが使いやすくなった

 

PHPには、複数行の文字列を扱うためのHeredocという構文があります。 例えば、

$message = <<<TEXT
こんにちは。
PHPを勉強しています。
今日はPHP 7について学びます。
TEXT;

このように複数行の文字列をまとめて記述できます。 PHP 7.3では、終了識別子の書き方が柔軟になりました。 細かい構文なので、初心者の段階では無理に覚える必要はありません。 「PHP 7.3ではHeredocやNowdocが改善された」 くらいを知っておけば十分です。

 

PHP 7.4では矢印関数も追加された

 

PHP 7.4では、もう1つ覚えておきたい機能があります。 それが、 矢印関数(Arrow Functions) です。 PHPでは、これまで無名関数を使っていました。 例えば、

$numbers = [1, 2, 3, 4, 5];
$result = array_map(function ($number) {
return $number * 2;
}, $numbers);

PHP 7.4では、これを矢印関数で短く書けます。

$numbers = [1, 2, 3, 4, 5];
$result = array_map(
fn($number) => $number * 2,
$numbers
);

かなり短くなりました。 ちょっとした処理であれば、矢印関数を使ったほうが読みやすい場合があります。 Laravelでもコレクション操作などでよく見かける書き方です。

 

PHP 7.4では型指定がさらに身近になった

 

ここまでの流れを振り返ってみましょう。 PHP 7.0では、

  • スカラー型宣言
  • 戻り値の型宣言

が追加されました。 PHP 7.1では、

  • nullable types
  • void
  • iterable

などが追加されました。 PHP 7.2では、

  • object型

が追加されました。 そしてPHP 7.4では、

  • 型付きプロパティ
  • 矢印関数

などが追加されました。 こうして見ると、PHP 7のバージョンアップでは、 「コードの中で型や意図をより明確に書けるようにする」 という方向に進んでいることが分かります。

 

PHP 8につながっていく

 

ここまでPHP 7.0〜7.4を見てきました。 そして次に登場するのがPHP 8です。 PHP 8では、さらに大きな機能が追加されました。 例えば、

  • Union Types
  • Attributes
  • match式
  • Nullsafe Operator
  • Named Arguments
  • Constructor Property Promotion
  • Enum
  • readonly
  • Property Hooks
  • Pipe Operator

などです。 これらは突然PHP 8で登場したように見えるかもしれません。 しかし、実際にはPHP 7で型指定やクラス構文などが少しずつ強化されてきた流れの上にあります。 例えばPHP 7.4で登場した型付きプロパティは、PHP 8.0のConstructor Property Promotionなどにもつながっています。 そのため、PHP 8を勉強するときにPHP 7の変化を知っておくと、 「なぜこの機能が追加されたのか」 が少し見えやすくなります。

 

まとめ

 

今回はPHP 7.1〜7.4で追加された主な機能を紹介しました。 今回覚えておきたいのは、次のあたりです。

  • nullable types ?string
  • void
  • iterable
  • object
  • 型付きプロパティ
  • 矢印関数

特に型付きプロパティは、現在のPHPコードを読むときにもよく出てきます。 例えば、

class User
{
public string $name;
public int $age;
}

このコードを見たときに、 「PHP 7.4以降では、プロパティにも型を指定できるんだな」 と分かれば十分です。 PHP 7はすでに古いバージョンですが、現在のPHPにつながる機能がたくさん追加された時期でもあります。 PHP 8の新機能を理解するために、PHP 7からの変化を順番に見ていくのは意外と面白いところです。 次回はさらに進んで、PHP 8.0以降で追加された機能をもう少し詳しく見ていきます。 特に match、Union Types、Attributes、Constructor Property Promotionなどは、現在のPHP開発でもよく登場する機能です。 PHP 7からPHP 8へ、どのように書き方が変わっていったのかを見ていきましょう。