読者です 読者をやめる 読者になる 読者になる

PHP 7.1.0 正式版をインストールして新機能を試してみる

【スポンサーリンク】

PHP 7.1.0 正式版がリリースされました。

http://php.net/releases/7_1_0.php

さっそくソースファイルからインストールして新機能を試してみます。なお、ここではWebサーバなどは使わず、単純にコマンドラインで実行を確認します。OS は VirtualBox 上の Ubuntu Server 16.04.1 LTS を使用し、必要なソフトウェアは、都度 apt でインストールしています。(例えば sudo apt install clang libxml2-dev make

まず、PHP 7.1.0 のソースファイルを取得します。

$ wget -O php-7.1.0.tar.gz http://jp2.php.net/get/php-7.1.0.tar.gz/from/this/mirror

ダウンロードしたファイルを展開し、展開したディレクトリに移動します。

$ tar zxf php-7.1.0.tar.gz
$ cd php-7.1.0

ソースファイルからビルドします。今回は試すだけなので ./configure のオプションには特に何も指定していません。

$ ./configure
$ make
$ make test
$ sudo make install

インストールに成功すると php コマンドが利用できるようになります。

$ php -v
PHP 7.1.0 (cli) (built: Dec  2 2016 14:02:04) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies

では、PHP 7.1.0 の新機能を試してみます。

nullable な型

関数の型宣言(PHP5ではタイプヒンティングとも呼ばれていました)で null を許容する仕組みが追加されました。nullable な型を使うためには型名の前に ? を付けます。

<?php
declare(strict_types=1);    // 確認のため厳密な型チェックを有効にする

// $flgはbool型かnull
// 戻り値はstring型かnull
function foo(?bool $flg): ?string 
{
    if (is_null($flg)) {
        return null;
    }

    return $flg ? 'Yes' : 'No';
}

echo foo(true);    // 文字列 'Yes' を返す
echo foo(false);   // 文字列 'No' を返す
echo foo(null);    // nullを返す
echo foo();        // エラー(Fatal error: Uncaught ArgumentCountError)
echo foo(1);       // エラー(Fatal error: Uncaught TypeError)

void 関数

値を返さない関数の戻り値の型にvoidを指定できるようになりました。

<?php
function foo(): void 
{
    echo 'Hello, world.';
}

[ ]構文による配列の分割代入

配列の各要素を変数に代入する際に、[]を使ってlist()よりも簡単に書けるようになりました。

<?php
$array = [1, 2, 3];
list($a, $b, $c) = $array;  // PHP7.0ではlist()で分割代入できる
[$a, $b, $c] = $array;      // PHP7.1では[]構文で分割代入できる

クラス内定数がアクセス権をサポート

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

<?php
class Foo 
{
    const BAR1 = 1;    // 指定しない場合はpublic

    private const BAR2 = 2;
    protected const BAR3 = 3;
    public const BAR4 = 4;
}

echo Foo::BAR1;    // 1を表示
echo Foo::BAR2;    // エラー(Fatal error: Uncaught Error)
echo Foo::BAR3;    // エラー(Fatal error: Uncaught Error)
echo Foo::BAR4;    // 4を表示

iterable 擬似型

関数の型宣言で配列かTraversableインターフェイスを実装したオブジェクトを示すiterableを指定できるようになりました。

<?php
function foo(iterable $ite): void 
{
    foreach ($ite as $value) {
        echo $value;
    }
}

foo([1, 2, 3]);    // 123を表示
foo('Hello');      // エラー(Fatal error: Uncaught TypeError)

複数の例外を1つのcatch構文で捕捉

複数の異なる型の例外を、1つのcatch構文で捕捉できるようになりました。

<?php
try {
   
} catch (ExceptionType1 | ExceptionType2 $e) {
    // 2つの例外 ExceptionType1 と ExceptionType2 を捕捉します
} catch (\Exception $e) {
   
}

list() におけるキーのサポート

配列をlist()を使って分割代入する際に、キーで指定できるようになりました。

<?php
$array = ['db_name' => 'test', 'db_user' => 'root', 'db_password' => 'secret'];

// 順番を気にすることなく、キーに紐づく変数に代入できる
list(
    'db_user' => $user,
    'db_password' => $password,
    'db_name' => $database
) = $array;

前述の[]による分割代入を利用するとより簡潔に書くことができます。

<?php
$array = ['db_name' => 'test', 'db_user' => 'root', 'db_password' => 'secret'];

// list()の代わりに[]を利用して分割代入
[
    'db_user' => $user,
    'db_password' => $password,
    'db_name' => $database
] = $array;

文字列のオフセットに負数をサポート

文字列の各文字に[]{}を使ってアクセスする際に、負数を使えるようになりました。

<?php
$string = 'Hello, world.';
$string[-1] = '!';  // 後ろから1文字目を '!' に上書き
echo $string;       // 'Hello, world!' を表示

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)

docs.hatenablog.jp