nakamura244 blog

所属団体とは関係なく、個人的なblog

phanを使ってPHP7化に向かって効率的にリファクタした話

はじめに

そろそろphp7化に向かって動きたいなぁーと感じてて互換性チェックとテストの手間のカットをするためにまずは利用していないコードを効率的に抽出して消したいなぁーと思ったのがキッカケです

コードの見通しもよくなるし、リファクタして不要コード、ファイル削除は皆嬉しいはず

phan

GitHub - phan/phan: Phan is a static analyzer for PHP. Phan prefers to avoid false-positives and attempts to prove incorrectness rather than correctness.

互換性チェックなら下記も使える

GitHub - sstalle/php7cc: PHP 7 Compatibility Checker

メインの話

php7との互換性チェックは別の時に書くこととして効率的なリファクタの話をしようと思います リファクタと言ってもどこからも参照されていないメソッドやファイルなどをガシガシ削減していく事をメインにした

phpmdで感じてた不満

  • publicメソッドでunuseメソッドの抽出ができない...privateはできる
  • ざっと眺めてるだけで使ってないpublicメソッドが結構あるなーと感じてたので効率的にあぶり出したい...
  • https://github.com/phpmd/phpmd

環境設定

<?php
return [
    'directory_list' => [
        '/php/app/'
    ],
    'exclude_analysis_directory_list' => [
        /php/app/tmp/',
        '/php/app/tmp_sp/',
        '/php/app/tests',
        '/php/app/migrations/',
    ]
];

実行

./vendor/bin/phan --progress-bar -x -o phan.log

オプションの説明

 -x, --dead-code-detection
  Emit issues for classes, methods, functions, constants and
  properties that are probably never referenced and can
  possibly be removed.

phan.logを眺める

結果

  • phpmdの時に感じてたpublicのメソッドのunuseを検出できないという不満があった(privateメソッドならできる)。けど100点とは行かないけどpublicなunuse メソッドの検出に成功した
    • FW部分とかで本当は参照しているけど検出してしまう部分は致し方ない
  • zero references to methodで指摘が出た部分がpublicでunuse methodという感じでcat phan.log | grep "zero references to method"でさらに絞ってみた
  • 結局上記のgrepで抽出したmethodをide(intellij)から検索して不要だったことを確認してからdeleteした😰
  • まぁでも効率的にリファクタはできたと思ってる💪🏽

気づき

  • Can run in the background (daemon mode)とあるので定期的にlocalの開発環境でも実行しようかなと思った
  • smartyから呼び出しているobjectのメソッドも解析対象として動いた
    • どうやって動いているんだろうと思ったけど、今回は前後の結果を見てちゃんと動いているなぁーというところまで確認した
    • イメージは下記
      • php側でuser情報を取得したmodel objectをそのままsmartyに渡す
      • smarty側でユーザのフルネームを取得するメドッドをコールする
<html>
<head>~~~
<body>
{$user->get_fullname()}
</body>
</html>

ちょっとしたオチ

  • function名を変数に入れて、その変数からfunctionを実行しているところは考慮されず、使ってないなーと感じて消してしまった。
    • bugを出してしまった😰
    • エラーログ監視で見つけてソッコー修正しましたけど...すまん

最後

  • まぁでも良かったんじゃなかろうか。効率的にリファクタできて