24
23

More than 5 years have passed since last update.

PHP 5.6.0で増えたopcodeについて調べてみる

Last updated at Posted at 2014-09-02

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);

参考:「PHP 5.6 以降における ...」

ZEND_SEND_UNPACK

「...」を使った、配列やTraversableの引数展開に対応します。たとえば次のようなコードで使われます。

<?php
function f($el1, $el2) {
    var_dump($el1);
    var_dump($el2);
}
f(...[0,1]);

参考:「PHP 5.6 以降における ...」

ZEND_POW

べき乗演算子「**」に対応するものです。たとえば次のようなコードで使われます。

<?php
$a = 3 ** 2

参考:「代数演算子」

ZEND_ASSIGN_POW

べき乗代入演算子「**=」に対応するものです。たとえば次のようなコードで使われます。

<?php
$a = 3;
$a **= 2;

まとめ

opcodeの観点からPHP 5.6の新機能を見てみました。リリースノートだけ見ても正直ピンと来ないので、こういうアプローチの調査も良いのではないでしょうか。

24
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
23