PHPプロジェクト向けのデッドコード検出ツールです。未使用のクラス、関数、use文などを発見します。
日本のレガシーPHPプロジェクト向け - EUC-JP/Shift_JISエンコーディングに完全対応しています。
-
未使用コード検出
- 未使用クラス、インターフェース、トレイト
- 未使用関数
- 未使用use文
- 未使用Composer依存パッケージ
-
PHPバージョン対応
- PHP 4.4 〜 PHP 8.3(PHP 4コードの解析に対応、段階的バージョンアップを支援)
-
エンコーディング対応
- UTF-8(BOMあり/なし)
- EUC-JP
- Shift_JIS
- 自動エンコーディング検出
-
出力形式
- テキスト(カラー出力対応)
- JSON
- XML
- JUnit XML(CI連携用)
- CSV
- GitHub Actions(アノテーション形式)
- HTML(レポート出力)
-
高速化
- ファイル単位のキャッシュ機能
- 変更ファイルのみ再解析
-
フレームワーク対応
- Laravel(ServiceProvider、Controller、Route等の認識)
- WordPress(フック、テーマ、プラグイン、ウィジェット等の認識)
- Symfony(Controller、Command、EventSubscriber、Doctrine等の認識)
composer require --dev php-knip/php-knip# カレントディレクトリを解析
./vendor/bin/php-knip
# 特定のディレクトリを解析
./vendor/bin/php-knip src/
# 設定ファイルを指定して解析
./vendor/bin/php-knip --config=php-knip.jsonUsage:
php-knip [options] [--] [<paths>...]
Arguments:
paths 解析対象パス(デフォルト: カレントディレクトリ)
Options:
-c, --config=CONFIG 設定ファイルのパス
-f, --format=FORMAT 出力形式: text, json, xml, junit, csv, github, html(デフォルト: text)
-o, --output=OUTPUT 出力ファイルパス(デフォルト: 標準出力)
--rules=RULES チェックするルール(カンマ区切り)
--exclude=EXCLUDE 除外パターン(カンマ区切り)
--encoding=ENCODING エンコーディング指定(auto, utf-8, euc-jp, shift_jis)
--php-version=VERSION パース用PHPバージョン(4.4, 5.6, 7.0, ..., 8.3)
--no-colors カラー出力を無効化
--no-cache キャッシュを無効化
--clear-cache キャッシュをクリアして実行
--fix 検出した問題を自動修正
--dry-run 修正をプレビュー(--fixと併用)
-v, --verbose 詳細出力
-h, --help ヘルプ表示
プロジェクトルートに php-knip.json を作成:
{
"include": [
"src/**/*.php",
"lib/**/*.php"
],
"exclude": [
"vendor/**",
"tests/**"
],
"rules": {
"unused-classes": true,
"unused-interfaces": true,
"unused-traits": true,
"unused-functions": true,
"unused-use-statements": true,
"unused-dependencies": true
},
"encoding": "auto",
"ignore": {
"symbols": [
"App\\Legacy\\*",
"*Controller"
],
"files": [
"bootstrap.php"
]
}
}未使用クラス (2)
✖ App\Services\OldService src/Services/OldService.php:10
✖ App\Utils\DeprecatedHelper src/Utils/DeprecatedHelper.php:5
未使用関数 (1)
✖ App\helper_function src/helpers.php:15
未使用use文 (3)
⚠ DateTime src/Controller/HomeController.php:5
⚠ App\Services\UnusedService src/Controller/HomeController.php:6
⚠ InvalidArgumentException src/Services/UserService.php:4
6件の問題を検出(エラー: 3, 警告: 3)
{
"summary": {
"total": 6,
"byType": {
"unused-classes": 2,
"unused-functions": 1,
"unused-use-statements": 3
},
"bySeverity": {
"error": 3,
"warning": 3
}
},
"issues": [
{
"type": "unused-classes",
"severity": "error",
"message": "Class 'App\\Services\\OldService' is never used",
"symbol": "App\\Services\\OldService",
"file": "src/Services/OldService.php",
"line": 10
}
]
}PHP-Knipは以下の方法でファイルのエンコーディングを自動検出します:
- BOM検出 - UTF-8, UTF-16, UTF-32
- declare(encoding=...) 文
- mbstring検出 - mb_detect_encodingによる自動検出
EUC-JPやShift_JISを使用するレガシーPHPプロジェクトでは、解析前に自動的にUTF-8に変換されます。
# EUC-JPを強制
./vendor/bin/php-knip --encoding=euc-jp src/legacy/
# Shift_JISを強制
./vendor/bin/php-knip --encoding=shift_jis src/old/{
"ignore": {
"symbols": [
"App\\Testing\\*",
"*Interface",
"App\\Legacy\\OldClass"
],
"files": [
"src/bootstrap.php",
"src/legacy/*"
]
}
}<?php
// @php-knip-ignore
class IgnoredClass {}
// @php-knip-ignore unused-class
class AnotherIgnoredClass {}Laravelプロジェクトを自動検出し、以下を考慮した解析を行います:
- ServiceProvider - 自動的に使用済みとして認識
- Controller - ルートファイルからの参照を検出
- Middleware - Kernelからの参照を検出
- Model/Job/Event/Listener - フレームワーク規約に基づいて認識
- 設定ファイル - config/*.php内のクラス参照を検出
WordPressプロジェクト(テーマ・プラグイン)を自動検出し、以下を考慮した解析を行います:
- フック -
add_action/add_filterのコールバック関数を参照として検出 - テーマ -
functions.phpやテンプレートファイルをエントリポイントとして認識 - プラグイン - プラグインヘッダーを持つファイルをエントリポイントとして認識
- ショートコード -
add_shortcodeのコールバックを検出 - ウィジェット -
WP_Widgetを継承したクラスを自動的に使用済みとして認識 - REST API -
register_rest_routeのコールバックを検出 - WP-CLI -
WP_CLI::add_commandで登録されたコマンドクラスを検出 - MU-Plugins -
wp-content/mu-plugins/内のファイルをエントリポイントとして認識 - Drop-ins -
object-cache.php、db.php等のドロップインを認識
- 標準的なWordPress構成(
wp-config.php、wp-content/) - Composer管理のWordPress(
johnpbloch/wordpress、roots/wordpress) - wpackagist経由のプラグイン/テーマ
Symfonyプロジェクトを自動検出し、以下を考慮した解析を行います:
- Controller -
src/Controller/内のコントローラークラスを自動的に使用済みとして認識 - Command - コンソールコマンドクラスを検出
- EventSubscriber/Listener - イベント処理クラスを検出
- Form Type - フォームタイプクラスを認識
- Twig Extension - Twig拡張クラスを認識
- Doctrine Entity/Repository - エンティティとリポジトリを認識
- Message Handler - Messengerハンドラーを認識
- Security Voter - セキュリティVoterを認識
- services.yaml - サービス定義からのクラス参照を検出
- routes.yaml - ルート定義からのコントローラー参照を検出
- bundles.php - バンドル登録からのクラス参照を検出
- Symfony Flex構成(
config/bundles.php、bin/console) symfony/framework-bundleまたはsymfony/http-kernelを使用するプロジェクト
PHP-Knipは解析結果をキャッシュし、変更されたファイルのみ再解析することで高速化を実現します。
- キャッシュは
.php-knip-cache/ディレクトリに保存されます - ファイルの更新日時とハッシュ値で変更を検出
- 変更がないファイルはキャッシュから結果を取得
# キャッシュを使用せずに実行
./vendor/bin/php-knip --no-cache
# キャッシュをクリアして実行
./vendor/bin/php-knip --clear-cache{
"cache": {
"enabled": true,
"directory": ".php-knip-cache"
}
}検出した問題の一部を自動的に修正できます。現在は未使用use文の削除に対応しています。
# 修正のプレビュー(dry-run: ファイルは変更されない)
./vendor/bin/php-knip --fix --dry-run
# 実際に修正を適用
./vendor/bin/php-knip --fix- 通常の解析ではファイルは一切変更されません
--fixオプションを明示的に指定した場合のみ、ファイルが修正されます--dry-runと併用すると、修正内容をプレビューできます(推奨)- 修正された問題はレポートから除外されます
| 問題タイプ | 修正内容 |
|---|---|
| 未使用use文 | use文の行を削除 |
フェーズ3: 自動修正...
修正を適用:
✔ src/Controller/HomeController.php:5 - Removed use statement 'DateTime' from line 5
✔ src/Controller/HomeController.php:6 - Removed use statement 'App\Services\UnusedService' from line 6
修正完了: 2 成功, 0 失敗, 1 スキップ
修正されたファイル: 1 件
- 修正前に必ず
--dry-runで確認することを推奨します - バージョン管理されていないファイルの修正は慎重に行ってください
- 複数行にまたがるuse文は正しく処理されない場合があります
--format=github を使用すると、PRのコード行に直接アノテーションが表示されます:
- name: Run PHP-Knip
run: ./vendor/bin/php-knip --format=githubテスト結果として出力し、各種CIツールと連携できます:
- name: Run PHP-Knip
run: ./vendor/bin/php-knip --format=junit --output=php-knip-report.xml
- name: Upload Test Results
uses: actions/upload-artifact@v3
with:
name: php-knip-results
path: php-knip-report.xml静的HTMLファイルとしてレポートを生成できます:
./vendor/bin/php-knip --format=html --output=report.html- PHP 5.6以上(実行環境)
- ext-mbstring(エンコーディング検出に推奨)
- PHP 4.4以上のコードを解析対象にできます(実行にはPHP 5.6以上が必要)
# 依存パッケージのインストール
composer install
# テスト実行
./vendor/bin/phpunit
# Docker環境でのテスト(複数PHPバージョン)
docker-compose run --rm php74 vendor/bin/phpunit
docker-compose run --rm php83 vendor/bin/phpunit- 未使用クラス/インターフェース/トレイト検出
- 未使用関数検出
- 未使用use文検出
- 未使用Composer依存検出
- Laravelプラグイン
- 未使用メソッド検出
- 未使用定数検出
- 未使用プロパティ検出
- 未使用ファイル検出
- キャッシュ機能
- WordPressプラグイン
- Symfonyプラグイン
- 自動修正機能
MIT License
