Список функций файла php - PullRequest
       3

Список функций файла php

8 голосов
/ 04 февраля 2010

Как получить список функций, которые объявлены в php-файле

Ответы [ 9 ]

17 голосов
/ 04 февраля 2010

Вы можете получить список определенных в настоящий момент функций, используя get_defined_functions():

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

Внутренние функции имеют индекс internal, а пользовательские функции - индекс user.

Обратите внимание, что при этом будут выведены все функции, которые были объявлены до этого вызова.Это означает, что если вы include() файлы с функциями, они также будут в списке.Нет никакого способа разделения функций для каждого файла, кроме как убедиться, что вы не * include() ни один файл до вызова get_defined_functions().


Если у вас должен быть список функций для каждого файла, следующий попытается получить список функций, проанализировав источник.

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;
}

Используйте на свой страх и риск.

10 голосов
/ 04 января 2012

Вы можете использовать get_defined_functions () до и после включения файла и посмотреть, что будет добавлено в массив во второй раз. Поскольку они выглядят в порядке определения, вы можете просто использовать индекс следующим образом:

  $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);
9 голосов
/ 04 февраля 2010

Вы можете использовать функцию get_defined_functions(), чтобы получить все определенные функции в вашем текущем скрипте.

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

Если вы хотите получить функции, определенные в другом файле, вы можете попробовать использовать http://www.php.net/token_get_all следующим образом:

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

Затем вы можете выполнить цикл, чтобы найти токены функций с определенными символами. Список токенов можно найти http://www.php.net/manual/en/tokens.php

2 голосов
/ 18 марта 2014

Если вы не беспокоитесь о том, чтобы найти некоторые закомментированные, это может быть самый простой способ:

preg_match_all('/function (\w+)/', file_get_contents(__FILE__), $m);
var_dump($m[1]);
0 голосов
/ 27 июня 2018

Чтобы получить список определенных и используемых функций в коде, с небольшим полезным файловым менеджером, вы можете использовать код ниже. Наслаждайтесь!

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)
}
0 голосов
/ 05 апреля 2017

Я решил эту проблему с 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"]

Обновление

Чтобы получить "настоящее" имя функции, попробуйте это

foreach($funcsDiff AS $newFunc) {
   $func = new \ReflectionFunction($newFunc);
   echo $func->getName(); // testFunc
}
0 голосов
/ 01 февраля 2014

Я написал эту маленькую функцию для возврата функций в файл.

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

Возвращает простой массив всех имен функций. Если вы вызываете его в конкретном файле, который хотите сканировать, вы можете просто использовать следующее:

$functions = get_functions_in_file(__FILE__);

0 голосов
/ 28 февраля 2013

Ну, по какой-либо причине, если вам нужно сделать это, я покажу вам:

Файл примера: Functions.php (я только что написал какое-то случайное дерьмо, не Mather, оно работает со всем)

<?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";

    }

?>

Здесь у нас есть 3 функции:

  1. Йоханнес
  2. рандомизация
  3. watdoetjho

Но мы также называем эти функции:

  1. count
  2. rand

Если мы используем get_defined_functions, мы получим все функции внутри области действия скрипта.Да, функции PHP отделены от заявленных пользователем, но все же мы хотим получить конкретный файл.

Если мы используем token_get_all, мы получим большой объем данных, который нам необходимо разделить первым.

Я нашел эти числа, которые нам нужны для создания некоторых соединений внутри массива, чтобы соответствовать пользователюфункции.В противном случае у нас будет список, включающий все вызываемые функции php.

Числа:

  • 334 (список всех объявленных пользователем функций)
  • 307 (список всех имен функций)

Если мы отфильтруем массив, чтобы принять все 334 элемента, мы получим следующее:

334 - | - function - | - 5

Но нам нужно имя функции, и все элементы массива связаны с 3-м значением.Итак, теперь нам нужно отфильтровать все элементы массива, которые соответствуют 3-му значению (5) и константе 307.

Это даст нам что-то вроде этого:

307 - | - johannes -| - 5

Теперь в PHP это будет выглядеть так:

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

Результат в этом случае:

307 -|- johannes -|- 5
307 -|- randomding -|- 31
307 -|- watdoetjho -|- 43
0 голосов
/ 04 февраля 2010

включите в файл и попробуйте это:

$functions = get_defined_functions();
print_r($functions['user']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...