php文件的函数列表

如何获取在php文件中声明的函数列表

您可以使用get_defined_functions()获取当前定义的函数列表:

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

内部函数位于索引internal而用户定义函数位于索引user

请注意,这将输出在该调用之前声明的所有函数。 这意味着,如果你include()文件的function,这些也将在列表中。 除了确保在调用get_defined_functions()之前不include()任何文件之外,没有办法将每个文件分开函数。


如果您必须拥有每个文件的函数列表,则下面将尝试通过parsing源文件来检索函数列表。

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

使用风险自负。

您可以使用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')); 

然后你可以通过循环来find定义符号的函数令牌。 令牌列表可以在http://www.php.net/manual/en/tokens.phpfind

您可以在包含文件之前和之后使用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); 

那么为什么如果你需要这样做,我告诉你:

示例文件:Functions.php(我只是写了一些随机的狗屎不马瑟它适用于一切)

 <?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. randomding
  3. watdoetjho

但是我们也称这些function为:

  1. 计数
  2. 兰特

如果我们使用get_defined_functions我们将得到脚本范围内的所有函数。 是的PHP函数是从用户声明的分离,但我们仍然希望从一个特定的文件。

如果我们使用token_get_all我们会收到大量需要先分离的数据。

我发现这些数字我们需要在数组中进行一些连接以匹配用户function。 否则,我们将有一个列表,其中包括所有被调用的php函数。

数字是:

  • 334(所有用户声明函数的列表)
  • 307(所有function名称的列表)

如果我们过滤数组来获取所有这334个元素:

334 – | – function – | – 5

但是我们需要函数的名字,所有的数组元素都与3th的值有关。 所以现在我们需要过滤所有匹配3rth值(5)和常数307的数组元素。

这会给我们这样的东西:

307 – | – 约翰内斯 – | – 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 chek is to ensure we only get the first peace of information about the function witch 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 

如果您不担心捕捉一些注释掉的内容,这可能是最简单的方法:

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

我写了这个小函数来返回文件中的函数。

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

它返回所有函数名称的简单数组。 如果您要在要扫描的特定文件中调用该文件,则可以使用以下命令:

$functions = get_functions_in_file(__FILE__);

我用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"] 

更新

要获得“真实”的function名称试试这个

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

请包括到该文件,并尝试这一点:

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