PHP で使われてなさそうなグローバル関数を見つけたい...

きっかけ

特定のファイルに定義されているグローバルな関数がどれくらい使われているのかシュッと調べたかった。 軽くググった感じだと PHP は組み込みで字句解析ができそうだったので、それとシェルコマンドを使って実現してみた。

対象

対象は以下のように関数が定義してあるファイル。

<?php

function globalFunction() { }

function globalFunction_2() { }

方法

考えた方法は

  • ARGV に渡されたファイルを読み込む
  • PHP 組み込みの関数を使ってコードをTokenizeする
  • Token の並びが関数っぽいものを出力
  • 出力された関数名をで grep する

というという感じで、実際のコードは以下。

<?php
$source = implode('', file($argv[1]));

$tokens = token_get_all($source, TOKEN_PARSE);

const MAPPING = [
    'start' => ['T_FUNCTION' => true],
    'end' => ['T_STRING' => true]
];

$processing = false;
foreach ($tokens as $token) {
    if (is_array($token)) {
        if ($processing) {
            if (MAPPING['end'][token_name($token[0])]) {
                echo $token[1], PHP_EOL;
                $processing = false;
            }
        } else {
            if (MAPPING['start'][token_name($token[0])]) {
                $processing = true;
            }
        }
    }
}

で、これを function_names.php みたいな名前で保存し、xargs と組み合わせて実行してあげると以下のように出力される。

$ php function_names.php global_functions.php | xargs -n 1 -I{} sh -c "echo {}; git grep {} | wc -l | tr -d ' '"
globalFunction
10

🎉 🎉 🎉 🎉

最後に

実質 PHP の処理系があれば確認できるところが便利なとこかな...?ざっと調べたい時なんかにどうぞ!もっといい方法があれば教えてください。