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)

1 Answer 1

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Oops - sorry! T_STRING is a character type and that threw me a curveball!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.