1

I'm using the code here - How can I find unused functions in a PHP project (reproduced below) exactly as it is - just the path modified to my location and it behaves as follows:

root@server [/var/www]# php see_unused_code.php
T_STRING

The code used is:

<?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]);
                }
        }
    }
?>

PHP version is:

PHP 5.3.3 (cli) (built: Aug  7 2010 14:49:50)
Community
  • 1
  • 1
siliconpi
  • 8,105
  • 18
  • 69
  • 107

1 Answers1

6

You should look at the source code, read it, understand it. Not just coopy-paste-run. Look at the define_file() function definition: if ($token[0] != T_STRING) die("T_STRING");

You can debug it by displaying the file-path where that condition occurs.

if ($token[0] != T_STRING) die("T_STRING: " . $path . " : " . $token[0]);

Then you'll know what the real problem is.

Ruel
  • 15,438
  • 7
  • 38
  • 49