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

  • 2022年9月7日
  • PHP

 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

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG