Как получить список функций, объявленных в php-файле
Вы можете получить список текущей функции, используя 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; }
Используйте на свой риск.
Вы можете использовать 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
Вы можете использовать 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 (я только что написал какое-то случайное дерьмо, это не 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"; } ?>
:<?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"; } ?>
У нас есть три функции внутри:
Но мы также называем эти функции:
Если мы используем get_defined_functions
мы получим все функции внутри области сценария. Да, функции PHP отделены от объявленных пользователем, но все же мы хотим от определенного файла.
Если мы используем token_get_all
мы получим большой объем данных, который нам нужно отделить первым.
Я нашел эти числа, нам нужно сделать некоторые соединения внутри массива в соответствии с пользовательскими функциями. В противном случае у нас будет список, включающий все функции php, которые вызываются.
Цифры:
Если мы фильтруем массив, чтобы взять все 334 элемента, мы имеем это:
334 – | – Функция – | – 5
Но нам нужно имя функции, и все элементы массива относятся к 3-му значению. Итак, теперь нам нужно отфильтровать все элементы массива, соответствующие совпадению 3-го значения (5) и постоянному числу 307.
Это даст нам что-то вроде этого:
307 – | – Форум о строительстве, ремонте и дизайне интерьера
Теперь в 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"]
Обновить
Чтобы получить имя «настоящих» функций, попробуйте это
foreach($funcsDiff AS $newFunc) { $func = new \ReflectionFunction($newFunc); echo $func->getName(); // testFunc }
включите в файл и попробуйте:
$functions = get_defined_functions(); print_r($functions['user']);