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

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

PHP新機能まとめ(v7.1~v7.3)

こんにちは。 新卒1年目のbadaikiです。

はじめに

まもなく入社して1年、配属されて9カ月、PHP歴9カ月になります。PHPの記法にもつまることなくコーディングできるようになったので、そろそろステップアップを目指していきます。
そこで今回は v7.1 ~ v7.3 で追加された新機能の一部を紹介し、今後に活かしていきます。

公式サポート期限

昨年 2018年12月 をもって v5.6 が EOL (End Of Life) を迎えました。

バージョン 初回リリース日 最新リリース 最新リリース日 アクティブサポート セキュリティサポート
7.3 2018/12/06 7.3.1 2019/01/10 2020/12/06 2021/12/06
7.2 2017/11/30 7.2.14 2019/01/10 2019/11/30 2020/11/30
7.1 2016/12/01 7.1.26 2019/01/10 2018/12/01 (終了) 2019/12/01
7.0 2015/12/03 7.0.33 2018/12/06 2017/12/03 (終了) 2018/12/03 (終了)
5.6 2014/08/28 5.6.40 2019/01/10 2017/01/19 (終了) 2018/12/31 (終了)

上記に従い、現在セキュリティサポートありのv7.1~v7.3を対象としました。

新機能

v7.1

nullableな型

パラメータや返り値の型宣言で nullable 指定ができるようになりました。 v7.0 で取り入れられた型変換の型の前にクエスチョンマークをつけると、nullable であることを指定できます。 nullable 指定をすると、指定した型だけでなく NULL も渡せるようになります。

<?php
function returnString() :?string {
    return "Hello!";
}

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

function dumpParam(?string $str) {
    var_dump($str);
}

var_dump(returnString());
var_dump(returnNull());
dumpParam("Hello!!!");
dumpParam(null);

出力結果

string(6) "Hello!"
NULL
string(8) "Hello!!!"
NULL
void関数

戻り値の型として void が導入されました。戻り値の型を void と宣言した関数は、関数内での return 文を省略するか、あるいは空の return を使う必要があります。 void 関数から NULL を返すことはできません。何か値を返そうとするとエラーになります。

<?php
function dumpParam(): void {
    var_dump("Hello!!!");
}

dumpParam();

出力結果

string(8) "Hello!!!"
対称的な配列の分解

配列の短縮構文 ( [ ] ) を使って、 代入用に配列の値を取り出せるようになりました (foreach でも使えます)。 これは、list() の代替として使えます (list() もまだ使えます)。

<?php
$colors = [
    ['apple', 'red'],
    ['banana', 'yellow']
];

echo "list形式\n";
foreach($colors as list($fruits, $color)) {
    echo $fruits . "'s color is " . $color . ".\n";
}

echo "[]形式\n";
foreach($colors as [$fruits, $color]) {
    echo $fruits . "'s color is " . $color . ".\n";
}

出力結果

list形式
apple's color is red.
banana's color is yellow.
[]形式
apple's color is red.
banana's color is yellow.
クラス定数のアクセス範囲指定

クラス定数のアクセス範囲を指定できるようになりました。

<?php
class ConstDemo
{
    const PUBLIC_CONST_1 = 1;
    public const PUBLIC_CONST_2 = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

v7.2

object型

object型が新たに導入されました。 任意のオブジェクトに対する (反変) パラメータの型付けや (共変) 返り値の型付けで使えます。

<?php

function test(object $obj) : object
{
    return new SplQueue();
}

test(new StdClass());
抽象メソッドのオーバーライド

ある抽象クラスが別の抽象クラスを継承しているときに、 継承元クラスの抽象メソッドをオーバーライドできるようになりました。

<?php
abstract class Animal {
    abstract function call($str);
}

abstract class Dog extends Animal {
    abstract function call($s);
}

v7.3

フレキシブルな HereDoc 構文と NowDoc 構文

v7.2 以前の HereDoc 構文と NowDoc 構文

<?php
//HereDoc 構文
echo <<<HERE
abc\n
HERE;

//NowDoc 構文
echo <<<'NOW'
def
NOW;

v7.2 の HereDoc 構文と NowDoc 構文では以下の記法により制限されていました。

  • 終端 ID はインデントのものにします。
  • 終端 ID のある行にはスペースやタブなどの文字を含めることはできません。
  • 終端 ID の前の最初の文字は改行にします。
  • 終端 ID の後に改行します。

v7.3 以降では記法が改善されます。

  1. 終端 ID のインデント、行頭スペースの削除が可能になる
  2. 終端 ID の改行要件が削除される

よって以下のように書くことで同じ結果が得られます。

v7.2

<?php
$values = <<<END
a
b
c
END
. ' d e';

v7.3

<?php
$values = <<<END
    a
    b
    c
    END . ' d e';
array_key_first(), array_key_last()

v7.2 以前では reset()、end() および key() 関数を使用して配列の最初と最後のキーを取り出すことができます。ただし、配列の内部ポインタを先頭や末尾に移動させてしまうため、コードの可読性とパフォーマンスが低下してしまいます。
v7.3 では array_key_first(), array_key_last() を追加しました。この関数は配列の内部ポインタに影響を与えずに先頭、末尾のキーを取得することができます。

おわりに

今回、v7.1 ~ v7.3 のバージョンアップで追加された新機能について一部を紹介しました。知っていれば取り入れられたなと思うものやどのように使えばよいのかわからないもありましたが、今後もバージョンアップにもアンテナを張り、追加された新機能や関数を使いこなしていきたいと思います。

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