PHPのZend VMのopcodeの定義はZend/zend_vm_opcodes.hにあり、このファイルのバージョン間の差分を見れば増えたopcodeがわかります。PHP 5.6.0で増えたopcodeは下記の4つです。
- ZEND_RECV_VARIADIC
- ZEND_SEND_UNPACK
- ZEND_POW
- ZEND_ASSIGN_POW
これらがPHPのどんな言語構造に対応するものか、PHP 5.6.0でvldを使って調べてみました。ただし、vldに自前で5.6対応パッチを当てる必要があるので注意してください。そのうち本家にパッチを送っておきます。
ZEND_RECV_VARIADIC
「...」を使った可変長引数の定義に対応します。たとえば次のようなコードで使われます。
<?php
function f(...$list) {
foreach ($list as $elem) {
var_dump($elem);
}
}
f(0,1,2,3);
ZEND_SEND_UNPACK
「...」を使った、配列やTraversableの引数展開に対応します。たとえば次のようなコードで使われます。
<?php
function f($el1, $el2) {
var_dump($el1);
var_dump($el2);
}
f(...[0,1]);
ZEND_POW
べき乗演算子「**」に対応するものです。たとえば次のようなコードで使われます。
<?php
$a = 3 ** 2
参考:「代数演算子」
ZEND_ASSIGN_POW
べき乗代入演算子「**=」に対応するものです。たとえば次のようなコードで使われます。
<?php
$a = 3;
$a **= 2;
まとめ
opcodeの観点からPHP 5.6の新機能を見てみました。リリースノートだけ見ても正直ピンと来ないので、こういうアプローチの調査も良いのではないでしょうか。