开发者

Function list of php file

How to get list开发者_如何学运维 of functions that are declared in a php file


You can get a list of currently defined function by using get_defined_functions():

$arr = get_defined_functions();
var_dump($arr['user']);

Internal functions are at index internal while user-defined function are at index user.

Note that this will output all functions that were declared previous to that call. Which means that if you include() files with functions, those will be in the list as well. There is no way of separating functions per-file other than making sure that you do not include() any file prior to the call to get_defined_functions().


If you must have the a list of functions per file, the following will attempt to retrieve a list of functions by parsing the source.

function get_defined_functions_in_file($file) {
    $source = file_get_contents($file);
    $tokens = token_get_all($source);

    $functions = array();
    $nextStringIsFunc = false;
    $inClass = false;
    $bracesCount = 0;

    foreach($tokens as $token) {
        switch($token[0]) {
            case T_CLASS:
                $inClass = true;
                break;
            case T_FUNCTION:
                if(!$inClass) $nextStringIsFunc = true;
                break;

            case T_STRING:
                if($nextStringIsFunc) {
                    $nextStringIsFunc = false;
                    $functions[] = $token[1];
                }
                break;

            // Anonymous functions
            case '(':
            case ';':
                $nextStringIsFunc = false;
                break;

            // Exclude Classes
            case '{':
                if($inClass) $bracesCount++;
                break;

            case '}':
                if($inClass) {
                    $bracesCount--;
                    if($bracesCount === 0) $inClass = false;
                }
                break;
        }
    }

    return $functions;
}

Use at your own risk.


You can use get_defined_functions() before and after you include the file, and look at what gets added to the array the second time. Since they appear to be in order of definition, you can just use the index like this:

  $functions = get_defined_functions();
  $last_index = array_pop(array_keys($functions['user']));
  // Include your file here.
  $functions = get_defined_functions();
  $new_functions = array_slice($functions['user'], $last_index);


You can use the get_defined_functions() function to get all defined function in your current script.

See: http://www.php.net/manual/en/function.get-defined-functions.php

If you want to get the functions defined in another file, you can try using http://www.php.net/token_get_all like this:

$arr = token_get_all(file_get_contents('anotherfile.php'));

Then you can loop through to find function tokens with the symbols defined. The list of tokens can be found http://www.php.net/manual/en/tokens.php


If you're not worried about catching some commented out ones, this might be the simplest way:

preg_match_all('/function (\w+)/', file_get_contents(__FILE__), $m);
var_dump($m[1]);


I wrote this small function to return the functions in a file.

https://gist.github.com/tonylegrone/8742453

It returns a simple array of all the function names. If you're calling it in the particular file you want to scan, you can just use the following:

$functions = get_functions_in_file(__FILE__);


I solved this problem with array_diff

$funcs = get_defined_functions()["user"];

require_once 'myFileWithNewFunctions.php'; // define function testFunc() {} here

var_dump( array_values( array_diff(get_defined_functions()["user"], $funcs) ) )
// output: array[ 0 => "test_func"]

Update

To get the "real" functions name try this

foreach($funcsDiff AS $newFunc) {
   $func = new \ReflectionFunction($newFunc);
   echo $func->getName(); // testFunc
}


Well for what ever reason if you need to do this I show you:

Example file: Functions.php (I just wrote some random shit does not Mather it works with everything)

<?php

    // gewoon een ander php script. door het gebruiken van meerdere includes kun je gemakkelijk samen aan één app werken

    function johannes($fnaam, $mode, $array){

        switch ($mode) {
            case 0:
                echo "
                        <center>
                        <br><br><br><br><br>
                            he johannes!<br><br>

                            klik hier voor random text:<br>
                            <input type='submit' value='superknop' id='btn' action='randomding' level='0' loadloc='randomshit' />
                            <p id='randomshit'></p>
                        </center>
                     ";
                break;
            case 1:
                echo "bouw formulier";
                break;
            case 2:
                echo "verwerk formulier";
                break;
             default:
                echo "[Error: geen mode gedefinieerd voor functie '$fnaam'!]";
        }
    }

    function randomding($fnaam, $mode, $array){

        $randomar = array('He pipo wat mot je!','bhebhehehehe bheeeee. rara wie ben ik?','poep meloen!','He johannes, wat doeeeeee je? <input type="text" name="doen" class="deze" placeholder="Wat doe je?" /> <input type="button" value="vertellen!" id="btn" action="watdoetjho" level="0" loadloc="hierzo" kinderen="deze"> <p id="hierzo"></p>','knopje de popje opje mopje','abcdefghijklmnopqrstuvwxyz, doe ook nog mee','Appien is een **p!!!!!! hahhahah<br><br><br><br> hahaha','Ik weet eiegelijk niks meer te verzinnen','echt ik weet nu niks meer','nou oke dan[[][(!*($@#&*$*^éäåðßð','he kijk een microboat: <br> <img src="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcS_n8FH6xzf24kEc31liZF6ULHCn2IINFurlFZ_G0f0_F4sLTi74w" alt="microboat" />');

        $tellen = count($randomar);
        $tellen--;

        $rand = rand(0, $tellen);

        echo $randomar[$rand];
    }

    function watdoetjho($fnaam, $mode, $array){

        $dit = $array['doen'];
        echo "Johannes is: $dit";

    }

?>

We have 3 functions inside here:

  1. johannes
  2. randomding
  3. watdoetjho

But we also call these functions:

  1. count
  2. rand

If we use get_defined_functions we will get all functions inside scope of script. Yes the PHP functions are separated from the user declared ones but still we want from a specific file.

If we use token_get_all we will receive a large amount of data we need to separate first.

I found these number which we need to make some connections inside the array to match the user functions. Otherwise we will have a list including all of php functions which are called upon.

The numbers are:

  • 334 (List of all the user declared functions)
  • 307 (List of all the function names)

If we filter the array to take all the 334 elements we have this:

334 -|- function -|- 5

But we need the function name and all the array elements are in relation with the 3rd value. So now we need to filter all the array elements which match the 3rd value (5) and the constant number 307.

This will give us something like this:

307 -|- johannes -|- 5

Now in PHP it will look like this:

<?php
    error_reporting(E_ALL ^ E_NOTICE); // Or we get these undefined index errors otherwise use other method to search array

    // Get the file and get all PHP language tokens out of it
    $arr = token_get_all(file_get_contents('Functions.php'));

    //var_dump($arr); // Take a look if you want

    //The array where we will store our functions
    $functions = array();

    // loop trough
    foreach($arr as $key => $value){

            //filter all user declared functions
        if($value[0] == 334){
                   //Take a look for debug sake
            //echo $value[0] .' -|- '. $value[1] . ' -|- ' . $value[2] . '<br>';

                    //store third value to get relation
                    $chekid = $value[2];
        }

            //now list functions user declared (note: The last check is to ensure we only get the first peace of information about the function which is the function name, else we also list other function header information like preset values)
        if($value[2] == $chekid && $value[0] == 307 && $value[2] != $old){

                    // just to see what happens
                    echo $value[0] .' -|- '. $value[1] . ' -|- ' . $value[2] . '<br>';
                    $functions[] = $value[1];
                    $old = $chekid; 
        }
    }
?>

Result in this case is:

307 -|- johannes -|- 5
307 -|- randomding -|- 31
307 -|- watdoetjho -|- 43


To get list of defined and used functions in code, with small useful file manager, you can use code below. Enjoy!

if ((!function_exists('check_password'))||(!check_password()) ) exit('Access denied.'); //...security!

echo "<html><body>";
if (!$f)    echo nl2br(htmlspecialchars('
    Useful parameters:
    $ext - allowed extensions, for example: ?ext=.php,css
    $extI - case-insensitivity, for example: ?extI=1&ext=.php,css
'));

if (($f)&&(is_readable($_SERVER['DOCUMENT_ROOT'].$f))&&(is_file($_SERVER['DOCUMENT_ROOT'].$f))) {

    echo "<h3>File <strong>$f</strong></h3>\n";

    if(function_exists('get_used_functions_in_code')) {
        echo '<h3>Used:</h3>';
        $is=get_used_functions_in_code(file_get_contents($_SERVER['DOCUMENT_ROOT'].$f));
        sort($is);
        $def=get_defined_functions();
        $def['internal']=array_merge($def['internal'], array('__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'finally', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while'));
        foreach ($def['user'] as &$e) $e=strtolower($e); unset($e);
        foreach ($is as &$e) if (!in_array(strtolower($e), $def['internal'], TRUE)) $e='<span style="color: red">'.$e.'</span>'; unset($e); //user-defined functions will be red
        echo implode('<br />'.PHP_EOL,$is);
    }
    else echo "Error: missing function 'get_used_functions_in_code' !";
    if(function_exists('get_defined_functions_in_code')) {
        echo '<br /><h3>Defined:</h3>';
        $is=get_defined_functions_in_code(file_get_contents($_SERVER['DOCUMENT_ROOT'].$f));
        sort($is);
        echo implode('<br />',$is);
    }
    else echo "Error: missing function 'get_defined_functions_in_code' !";
}

/*
    File manager
*/
else {
    if (!function_exists('select_icon')) {
        function select_icon($name) {$name = pathinfo($name); return '['.$name["extension"].']';}
    }

    if($ext) $extensions=explode(',',strrev($ext));
    if(!$f) $f=dirname($_SERVER['PHP_SELF']);
    echo "<h3>Dir ".htmlspecialchars($f)."</h3><br />\n<table>";
    $name=scandir($_SERVER['DOCUMENT_ROOT'].$f);

    foreach($name as $name) {
        if (!($fileOK=(!isset($extensions)))) {
            foreach($extensions as $is) if (!$fileOK) $fileOK=((strpos(strrev($name),$is)===0)||($extI &&(stripos(strrev($name),$is)===0)));
        }
        $is=is_dir($fullName=$_SERVER['DOCUMENT_ROOT']."$f/$name");
        if ($is || $fileOK) echo '<tr><td>'.select_icon($is ? 'x.folder' : $name).'&nbsp;</td><td>&nbsp;'.($is ? '[' : '').'<a href="?f='.rawurlencode("$f/$name").($extI ? "&extI=$extI" : '').($ext ? "&ext=$ext" : '').'">'.htmlspecialchars($name).'</a>'.($is ? ']' : '').'</td>';
        if ($is) echo '<td>&nbsp;</td><td>&nbsp;</td>';
        elseif ($fileOK) echo '<td style="text-align: right">&nbsp;'.number_format(filesize($fullName),0,"."," ").'&nbsp;</td><td>&nbsp;'.date ("Y.m.d (D) H:i",filemtime($fullName)).'</td>';
        if ($is || $fileOK) echo '</tr>'.PHP_EOL;
    }
    echo "\n</table>\n";
}

echo "<br /><br />".date ("Y.m.d (D) H:i")."</body></html>";
return;

/********************************************************************/


function get_used_functions_in_code($source) {
    $tokens = token_get_all($source);
    $functions = array();
    $thisStringIsFunc = 0;

    foreach($tokens as $token) {
        if(($token[0]!=T_WHITESPACE)&&((!is_string($token))||($token[0]!='('))) unset($func);
        if((is_array($token))&&(in_array($token[0],array(T_EVAL,T_EXIT,T_INCLUDE,T_INCLUDE_ONCE,T_LIST,T_REQUIRE,T_REQUIRE_ONCE,T_RETURN,T_UNSET)))) {$token[0]=T_STRING;$thisStringIsFunc=1;}
        switch($token[0]) {
            case T_FUNCTION: $thisStringIsFunc=-1;
            break;
            case T_STRING:
                if($thisStringIsFunc>0) {
                    if (!in_array(strtoupper($token[1]),$functionsUp)) {$functions[]=$token[1];$functionsUp[]=strtoupper($token[1]);}
                    $thisStringIsFunc = 0;
                } elseif ($thisStringIsFunc+1>0) {
                    $func = $token[1];
                } else $thisStringIsFunc = 0;

            break;
            case '(':if($func) if(!in_array(strtoupper($func),$functionsUp)) {$functions[]=$func;$functionsUp[]=strtoupper($func);}
        }
    }

    return $functions;
}

/********************************************/

function get_defined_functions_in_code($source) {
    $tokens = token_get_all($source);

        ... then Andrew code (get_defined_functions_in_file) (https://stackoverflow.com/a/2197870/9996503)
}


Finding string (eg. Function names) in a file is simple with regex. Just read the file and parse the content using preg_match_all.

I wrote a simple function to get list of functions in a file.

https://gist.github.com/komputronika/f92397b4f60870131ef52930faf09983

$a = functions_in_file( "mylib.php" );


The simplest thing (after I saw @joachim answer) is to use get_defined_functions and then only watch for the 'user' key (which contains an array of user-defined methods)

This is the code that helped me solved the problem

<?php
//Just to be sure it's empty (as it should be)
$functions = get_defined_functions();
print_r($functions['user']); 

//Load the needed file 
require_once '/path/to/your/file.php';

//display the functions loaded 
$functions2 = get_defined_functions();
print_r($functions2['user']);


To retrieve also the params definition: (Source in comments)

Array

(
    [0] => function foo ( &&bar, &big, [$small = 1] )

    [1] => function bar ( &foo )

    [2] => function noparams (  )

    [3] => function byrefandopt ( [&$the = one] )

)

$functions = get_defined_functions();
$functions_list = array();
foreach ($functions['user'] as $func) {
        $f = new ReflectionFunction($func);
        $args = array();
        foreach ($f->getParameters() as $param) {
                $tmparg = '';
                if ($param->isPassedByReference()) $tmparg = '&';
                if ($param->isOptional()) {
                        $tmparg = '[' . $tmparg . '$' . $param->getName() . ' = ' . $param->getDefaultValue() . ']';
                } else {
                        $tmparg.= '&' . $param->getName();
                }
                $args[] = $tmparg;
                unset ($tmparg);
        }
        $functions_list[] = 'function ' . $func . ' ( ' . implode(', ', $args) . ' )' . PHP_EOL;
}
print_r($functions_list);


do include to the file and try this :

$functions = get_defined_functions();
print_r($functions['user']);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜