浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

【PHP】PHP7.1より前のバージョンではクロージャとstatic変数を組み合わせて if文を無視した処理ができる

 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への移行のドキュメント内で触れられていない点があります。特にバグ修正のログも見つかりませんでしたし、何かの改修の際にいい感じに化けたのかもしれません。

PHP: PHP 7.0.x から PHP 7.1.x への移行 – Manual

  • この記事いいね! (0)