PHP 7.2.0 Alpha 1をインストールして新機能を試してみる

【スポンサーリンク】

PHP 7.2系の初めてのAlpha版である PHP 7.2.0 Alpha 1がリリースされました。

http://php.net/archive/2017.php#id2017-06-08-2

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

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

$ wget https://downloads.php.net/~pollita/php-7.2.0alpha1.tar.gz

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

$ tar zxf php-7.2.0alpha1.tar.gz
$ cd php-7.2.0alpha1

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

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

sudo make install 時にPEARに関する次のようなエラーメッセージが表示されましたが、今回の試用には影響は無いのでそのまま進めます。

Makefile:445: ターゲット 'install-pear-installer' のレシピで失敗しました
make[1]: *** [install-pear-installer] エラー 255
Makefile:448: ターゲット 'install-pear' のレシピで失敗しました
make: *** [install-pear] エラー 2

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

$ php -v
PHP 7.2.0alpha1 (cli) (built: Jun 10 2017 15:27:20) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0-dev, Copyright (c) 1998-2017 Zend Technologies

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

オーバーライドされたメソッドの型宣言の省略

PHP 7.1 ではメソッドをオーバライドする際、親クラスと子クラスの引数の型宣言を同じものにする必要がありましたが、PHP 7.2 では子クラスの引数の型宣言を省略することができるようになりました。

<?php
class Foo
{
    public function hello(string $str)
    {
        echo "{$str} in Foo.\n";
    }
}

class Bar extends Foo
{
    // PHP 7.1 では public function hello(string $str) と書く必要がありました
    public function hello($str)
    {
        echo "{$str} in Bar.\n";
    }
}

$bar = new Bar();
$bar->hello('Hello, PHP 7.2');    // Hello, PHP 7.2 in Bar. を表示

これにより、今までは親クラスのメソッドに型宣言を追加すると、すべての子クラスのメソッドを変更しなければなりませんでしたが、 PHP 7.2 では子クラスをひとつずつ変更することができるので、変更作業を段階的に行うことができます。

抽象メソッドのオーバーライドを許可

抽象(abstract)メソッドをオーバーライドできるようになりました。

<?php
abstract class Foo
{
    abstract function bar(string $x);
}

abstract class Bar extends Foo 
{ 
    abstract function bar(string $x): int; 
}

名前空間のリスト構文で最後のカンマを許可

名前空間をグループ化してリスト状に書く場合、最後にカンマを書けるようになりました。

<?php
// PHP 7.1 では use Foo\Bar\{ Foo, Bar }; と書く必要がありました
use Foo\Bar\{ Foo, Bar, };

リストの最後にカンマを許可する提案は、関数の引数やクラスのメンバ変数などの他の構文でもあったようですが、投票の結果、採用されたのは名前空間グループ化(use)だけだったようです。 https://wiki.php.net/rfc/list-syntax-trailing-commas

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

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

docs.hatenablog.jp