PHP7を魔改造した話
Moriyoshi Koizumi <moriyoshi@php.net>
端的には
• ES6-styleのarray decompositionを実装してみました。
<?php
$a = 1;
$b = 2;
list($a, $b) = [$b, $a];
var_dump($a); // 2
var_dump($b); // 1
<?php
$a = 1;
$b = 2;
[$a, $b] = [$b, $a];
var_dump($a); // 2
var_dump($b); // 1
Before
After
他のサンプル
<?php
$db = new PDO('...');
$rows = $db->query('SELECT hoge, fuga FROM foo;');
foreach ($rows as [$hoge, $fuga]) {
// ...
}
やったこと
• zend_language_parser.y に手を入れる
• zend_compile.c を直す
zend_language_parser.y
• 最初は T_LIST ’(’ assignment_list ’)’ をパースしている部分に
’[’ assignment_list ’]’ をカジュアルに突っ込んでみた
• reduce / reduce conflict が発生する
• [$a, $b, $c] = [$a, $b, $c] = [$a, $b, $c]
のようなケースでの曖昧さ
• ZEND_AST_LIST を生成するルールを取り除き ZEND_AST_ARRAY を生
成するルールに一本化することで曖昧さを回避
• 代入として正しくない構文は AST の解析時にエラーを出す
• PHP7でとてもやりやすくなった部分
zend_compile.c
• ZEND_AST_LIST を扱っているところを ZEND_AST_ARRAY に書き換え
て回る
• ZEND_AST_LIST と ZEND_AST_ARRAY とでは木構造が異なるので、そ
の部分も修正
ZEND_AST_LIST
ZEND_AST_VAR ZEND_AST_VAR
ZEND_AST_ARRAY
ZEND_AST_ARRAY_ELEM ZEND_AST_ARRAY_ELEM
ZEND_AST_EXPRZEND_AST_EXPR ZEND_AST_EXPR ZEND_AST_EXPR
副作用
• list(…) でarrayを定義できるようになった
<?php
$a = list(
'a' => 'b',
'c' => list()
);
Diffはこちら
• https://github.com/moriyoshi/php-src/pull/1/files

PHP7を魔改造した話