How can I find unused functions in a PHP project
Thanks Greg and Dave for the feedback. Wasn't quite what I was looking for, but I decided to put a bit of time into researching it and came up with this quick and dirty solution:
<?php
$functions = array();
$path = "/path/to/my/php/project";
define_dir($path, $functions);
reference_dir($path, $functions);
echo
"<table>" .
"<tr>" .
"<th>Name</th>" .
"<th>Defined</th>" .
"<th>Referenced</th>" .
"</tr>";
foreach ($functions as $name => $value) {
echo
"<tr>" .
"<td>" . htmlentities($name) . "</td>" .
"<td>" . (isset($value[0]) ? count($value[0]) : "-") . "</td>" .
"<td>" . (isset($value[1]) ? count($value[1]) : "-") . "</td>" .
"</tr>";
}
echo "</table>";
function define_dir($path, &$functions) {
if ($dir = opendir($path)) {
while (($file = readdir($dir)) !== false) {
if (substr($file, 0, 1) == ".") continue;
if (is_dir($path . "/" . $file)) {
define_dir($path . "/" . $file, $functions);
} else {
if (substr($file, - 4, 4) != ".php") continue;
define_file($path . "/" . $file, $functions);
}
}
}
}
function define_file($path, &$functions) {
$tokens = token_get_all(file_get_contents($path));
for ($i = 0; $i < count($tokens); $i++) {
$token = $tokens[$i];
if (is_array($token)) {
if ($token[0] != T_FUNCTION) continue;
$i++;
$token = $tokens[$i];
if ($token[0] != T_WHITESPACE) die("T_WHITESPACE");
$i++;
$token = $tokens[$i];
if ($token[0] != T_STRING) die("T_STRING");
$functions[$token[1]][0][] = array($path, $token[2]);
}
}
}
function reference_dir($path, &$functions) {
if ($dir = opendir($path)) {
while (($file = readdir($dir)) !== false) {
if (substr($file, 0, 1) == ".") continue;
if (is_dir($path . "/" . $file)) {
reference_dir($path . "/" . $file, $functions);
} else {
if (substr($file, - 4, 4) != ".php") continue;
reference_file($path . "/" . $file, $functions);
}
}
}
}
function reference_file($path, &$functions) {
$tokens = token_get_all(file_get_contents($path));
for ($i = 0; $i < count($tokens); $i++) {
$token = $tokens[$i];
if (is_array($token)) {
if ($token[0] != T_STRING) continue;
if ($tokens[$i + 1] != "(") continue;
$functions[$token[1]][1][] = array($path, $token[2]);
}
}
}
?>
I'll probably spend some more time on it so I can quickly find the files and line numbers of the function definitions and references; this information is being gathered, just not displayed.
Find unused public and protected methods in PHPStorm
It was requested previously, and thanfully is possible since PhpStorm 2019.1 EAP #6 (see here for details).
You can create a new inspection profile with only this inspection, and use Inspect code... then to find all dead code in your app. Note that this inspection allows you to explicitly set if you want to report fields, methods etc., with what visibility level, and to even set entry points!
Tools to detect useless file or useless code PHP
PHP Mess Detector (PHPMD):
- Possible bugs;
- Suboptimal code;
- Overcomplicated expressions;
- Unused parameters, methods, properties.
PHPMD will show to you all mess created in your code. It's also show the cyclomatic complexity of your codem which will let you do a few code optimizations.
PHP Depend
PHPMD is a spin-off of PHP Depend. PHP Depend will show to you better metrics and graphics of your software than PHPMD. A really powerfull tool, better than PHPMD for optimization, but with a different purpose.
Mark Baker also talked about PHP Dead Code Detector (PHPDCD). IDK the project, but seems very similar to PHPMD.
Tool or IDE giving hints about unused functions / missing parameters for PHP
you can use
- Atom Lint package and linter package for your particular language.
- Atom Beautify to help you clean your code.
- Look for package for static analysis tools for your language.
How do I use Psalm's UnusedMethod Feature?
Psalm creator here - dead code detection only detects unused classes and methods when the entire project is analysed - e.g. ./vendor/bin/psalm --find-dead-code
, omitting src/test.php
.
While private methods and properties are a special case (their non-use can be inferred without checking the entire project), for public/protected methods and properties everything must be consumed.
Related Topics
How to Zip Folder Without Full Path
Generating Random Numbers Without Repeats
How to Prevent Pdo from Interpreting a Question Mark as a Placeholder
Mechanisms for Tracking Db Schema Changes
Calculate Difference Between Two Dates Using Carbon and Blade
Compare Multidimensional Arrays in PHP
Phpmyadmin - Count(): Parameter Must Be an Array or an Object That Implements Countable
Laravel 5 Change Public_Path()
Header in PDF Page Using Dompdf in PHP
Can't Install PHP Package on Centos
How to Add Anchor Tag to a Url from Text Input
Mysqli Query Results to Show All Rows
How to Convert String to Boolean PHP
How to Use PHP to Check If a Directory Is Empty