レガシーコードのevalでハマり散らかしたので共有。
例えばこういう関数を定義して・・・
function foo($code, $val) {
$res = eval($code);
echo $res . PHP_EOL;
}
普通に呼び出す。
//出力したい文字列
$val = "Hello World";
//evalで実行するPHPコード(※再現するためにエスケープして埋め込んでます)
$phpCode = "echo \$val;";
foo($phpCode, $val);
Hello World
普通に動く。
ここからが本題
静的解析で未使用のパラメータがありますって言われるので、消すと・・・
- function foo($code, $val) {
+ function foo($code) {
$res = eval($code);
echo $res . PHP_EOL;
}
PHP Notice: Undefined variable: val in /file/path/index.php(7) : eval()'d code on line 1
何も出力されないという罠。
evalは文字列をPHPコードとして実行するので、文字列として埋め込まれた変数までは当然解析で追えない。
まとめ
デバッグが難解なレガシーコードはマジで怖いです。
PHPマニュアルにも危険って書いてあるし、使わなくても開発できる場面しか思い浮かばないので今後使うことは無さそう・・・。