PHP7.0は既にサポートの切れたバージョンの PHP であり、紹介する挙動はPHP7.1以降に修正済みです。とはいえなかなか面白い挙動でしたので紹介です。何が起きるかというと具体的には次です。
<?php $v = 'init value';// あらかじめ外で変数を用意して $fn = function() use ($v) {// use することでクロージャ内で使えるようにすると if (false) { static $v = 'changed value';// ここの変数宣言が何故か有効になって $v の値が書き換わる static $z = 'undefined';// こっちはちゃんと無効化されて、$zは未定義変数のまま echo 'ここは走らない'; } echo ' $v: '.$v ."\n"; echo 'isset($z): '. var_export(isset($z), true) ."\n"; }; $fn();
Online PHP editor | output for 7ELQZ
if (false) { static $v = 'changed value'; }
が何故か実行され、$v の値が変わります。クロージャとstatic変数という組み合わせが起こった時にのみ起こる現象であり、これが問題になるケースはそうそうないでしょうが if 文を無視するというのは衝撃的な挙動です。
特筆すべき点としてPHP7.0からPHP7.1への移行のドキュメント内で触れられていない点があります。特にバグ修正のログも見つかりませんでしたし、何かの改修の際にいい感じに化けたのかもしれません。