こんにちは、久保田です。PHP5.6.0alpha1が1月23日付けでリリースされました。
この記事では5.6に搭載される以下の新機能や変更を紹介します。
PHP5.6の新機能を紹介する前に、まずはMacOSXやLinux環境にPHP5.6をビルドして試す方法を紹介します。Windows環境の場合にはビルド済みのバイナリが用意されているのでそれをダウンロードして下さい。
まず5.6.0alpha1リリースの記事にあるリンクから、PHP5.6.0alpha1のパッケージをダウンロードして解凍します。次に解凍したパッケージのディレクトリに進んでconfigureスクリプトを叩きます。
$ cd php-5.6.0alpha1/
$ ./configure
この時ビルドに必要なツールがない場合には失敗して警告が出るので、メッセージに従って必要なツールをインストールして下さい。ビルドに必要なツールの詳細についてはPHPマニュアルのUnix システムへのインストールの項を参照して下さい。
configureスクリプトが無事終わって、makeコマンドを叩くとビルドが始まります。
$ make
ビルドが無事終わったらsapiディレクトリ以下に各種バイナリが生成されていることを確認します。コマンドラインで利用するPHPは、sapi/cli/phpに置かれています。今回のこの記事で紹介するphpdbgはsapi/phpdbg/phpdbgに置かれています。
$ sapi/cli/php -v
PHP 5.6.0alpha1 (cli) (built: Jan 31 2014 13:07:58)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0-dev, Copyright (c) 1998-2014 Zend Technologies
$ sapi/phpdbg/phpdbg --version
phpdbg 0.3.1 (built: Jan 31 2014 13:08:01)
PHP 5.6.0alpha1, Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0-dev, Copyright (c) 1998-2014 Zend Technologies
さてPHP5.6をビルドできたところで、5.6の新機能を説明します。
これまで、PHPのコードにブレークポイントを仕掛けてデバッグする場合には、phpdbgやxdebugなどのモジュールをPECLでインストールしてセットアップする必要がありました。PHP5.6ではデバッグ用のSAPIを提供しているphpdbgモジュールが標準で含まれるようになりました。
ここでは簡単にphpdbgの使い方を紹介してみます。まず、デバッグ対象である以下のPHPのコードをhoge.phpというファイル名で保存します。
<?php // hoge.php
$hoge = 'hogehoge';
echo $hoge . "\n";
phpdbgは、gdbライクなインターフェイスでxdebugよりも手軽に利用できるデバッガです。phpdbgコマンドから起動して簡単に利用できます。読み込むPHPファイルは、-eオプションで起動時に渡します 。
$ sapi/cli/phpdbg -e hoge.php
[Welcome to phpdbg, the interactive PHP debugger, v0.3.1]
To get help using phpdbg type "help" and press enter
[Please report bugs to <http://github.com/krakjoe/phpdbg/issues>]
PHPファイルを読み込んで、特に何もせずにrunコマンドで実行してみます。
phpdbg> run
[Attempting compilation of /Users/anatoo/Desktop/php-5.6.0alpha1/hoge.php]
[Success]
hogehoge
phpdbg>
これだけだと何の意味もないので、次はhoge.phpの中身をコンパイルしてその結果であるオペコードを覗いてみます。
PHPのコードは、PHPの言語処理系によってパースされて内部のZendEngineによって実行できる内部表現にコンパイルされた後に実行されます。ZendEngine向けにコンパイルされる内部表現をオペコードといいます。
今までこのオペコードを見るには、vldというPECLモジュールをインストールする必要がありましたが、このphpdbgではオペコードも簡単に覗けます。
compileコマンドでソースコードをオペコードへコンパイルをして、print execコマンドを打つとコンパイルされたhoge.phpのオペコードが表示されます。
phpdbg> compile
[Destroying previously compiled opcodes]
[Attempting compilation of /Users/anatoo/Desktop/php-5.6.0alpha1/hoge.php]
[Success]
phpdbg> print exec
[Context /Users/anatoo/Desktop/php-5.6.0alpha1/hoge.php]
L0-0 {main}() /Users/anatoo/Desktop/php-5.6.0alpha1/hoge.php
L3 0x10a188ff8 ZEND_ASSIGN $hoge C0 @0
L5 0x10a189028 ZEND_ECHO $hoge <unused> <unused>
ZEND_ASSIGNという$hogeに’hogehoge’値が代入する命令と、ZEND_ECHOという$hogeの値が表示するという命令のオペコードが表示されます。
これだけだとつまらないので、次にデバッガらしくブレークポイントを張ってステップ実行する方法を紹介します。ブレークポイントを張るには、breakコマンドを使ってブレークする位置を指定します。
ブレークポイントに指定できるのは、ファイルの行数や関数名やメソッド名やそれ以外にもオペコードや特定の条件下にのみブレークするなど、かなり柔軟に指定できます。
ここではhoge.phpの3行目を指定してみます。break (ファイル 名):(行数)という形で指定します。
phpdbg> break hoge.php:3
[Breakpoint #0 added at /Users/anatoo/Desktop/php-5.6.0alpha1/hoge.php:3]
ブレークポイントを張ったら、次にrunコマンドで実行します。
phpdbg> run
[Breakpoint #0 at /Users/anatoo/Desktop/php-5.6.0alpha1/hoge.php:3, hits: 1]
00002:
>00003: $hoge = 'hogehoge';
00004:
3行目でブレークしています。ブレークしている状態で、nextコマンドやstepコマンドを使うとステップ実行できます。
phpdbg> next
hogehoge
phpdbg>
phpdbgデバッガの詳しい使い方は、phpdbgのウェブサイトや以下の参考資料を参照して下さい。
関数やメソッドで、可変長引数を取るための文法が追加されました。以下のようなコードが動きます。
<?php
function foo(...$args)
{
var_dump($args);
}
foo(1, 2, 3);
// => array(3) {
// [0]=>
// int(1)
// [1]=>
// int(2)
// [2]=>
// int(3)
// }
class Foobar {}
function bar($first, Foobar ...$args)
{
var_dump($args);
}
bar(1, new Foobar, new Foobar);
// => array(2) {
// [0]=>
// object(Foobar)#1 (0) {
// }
// [1]=>
// object(Foobar)#2 (0) {
// }
// }
これまでは、可変長引数を扱うにはfunc_get_args()関数を使う必要がありましたが、今回追加された文法により以下のように記述できるようになりました。
参考:
クラス定数や、プロパティや引数のデフォルト値を設定する定数定義で計算をサポートするようになりました。計算に利用できるのは、スカラー値や他の定数を用いた演算子による計算です。以下のようなコードが動きます。
<?php
const A = 60 * 60 * 5;
const B = A > 0 ? 'A' : 'B';
もちろんクラス定数やプロパティの初期化でも利用できます。
<?php
class Foobar
{
const A = 10;
const B = A * 10;
public $a = 1 << 0;
public $b = 1 << 1;
public $c = 1 << 2;
}
さらに、関数・メソッドのデフォルト引数やstatic変数の初期化時にも利用できます。
<?php
class Foo
{
const A = 'hoge';
function doSomething($a = 10 * 10, $b = self::A . 'str')
{
// ...
}
}
function foo()
{
static $bar = 10 * 10 * Foo::A;
}
参考:
NEWSファイルに記載されているその他の変更をリストにしておきます。
以下に、NEWSファイルの簡単な訳を掲載します。細かな変更点はこれを参照して下さい。
PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
23 Jan 2014, PHP 5.6.0 Alpha 1
- CLI server: