есть ли способ узнать, откуда была вызвана функция в PHP? пример:
function epic()
{
fail();
}
function fail()
{
//at this point, how do i know, that epic() has called this function?
}
php
function-calls
pol_b
источник
источник
debug_backtrace()
какая замечательная функция. Я воспользуюсь этим!Использование
debug_backtrace()
:function fail() { $backtrace = debug_backtrace(); // Here, $backtrace[0] points to fail(), so we'll look in $backtrace[1] instead if (isset($backtrace[1]['function']) && $backtrace[1]['function'] == 'epic') { // Called by epic()... } }
источник
debug_backtrace()
- это дорогое удовольствие. Не приобретайте привычку использовать его для определения цепочек вызовов. Если вы хотите «защитить» эти функции, попробуйте ООП и защищенные методы.Самое быстрое и простое решение, какое я нашел
public function func() { //function whose call file you want to find $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); } $trace: Array ( [0] => Array ( [file] => C:\wamp\www\index.php [line] => 56 [function] => func [class] => (func Class namespace) [type] => -> ) )
Тестирую скорость на ноутбуке Lenovo: Intel Pentiom CPU N3530 2.16GHz, RAM 8GB
global $times; $start = microtime(true); $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); $times[] = microtime(true) - $start;
Полученные результаты:
count($times): 97 min: 2.6941299438477E-5 max: 10.68115234375E-5 avg: 3.3095939872191E-5 median: 3.0517578125E-5 sum: 321.03061676025E-5 the same results with notation without E-5 count($times): 97 min: 0.000026941299438477 max: 0.0001068115234375 avg: 0.000033095939872191 median: 0.000030517578125 sum: 0.0032103061676025
источник
Итак, если вы все еще ДЕЙСТВИТЕЛЬНО не знаете как, то вот решение:
$backtrace = debug_backtrace(); echo 'Mu name is '.$backtrace[1]['function'].', and I have called him! Muahahah!';
источник
Используйте функцию debug_backtrace: http://php.net/manual/en/function.debug-backtrace.php
источник
Попробуйте код ниже.
foreach(debug_backtrace() as $t) { echo $t['file'] . ' line ' . $t['line'] . ' calls ' . $t['function'] . "()<br/>"; }
источник
Если вы хотите отследить точное происхождение вызова в верхней части стека, вы можете использовать следующий код:
Это проигнорирует связанные функции и получит только самую релевантную информацию о вызовах (релевантность используется нечетко, поскольку это зависит от того, что вы пытаетесь выполнить).
источник
function findFunction($function, $inputDirectory=""){ //version 0.1 $docRoot = getenv("DOCUMENT_ROOT"); $folderArray = null; $dirArray = null; // open directory $directory = opendir($docRoot.$inputDirectory); // get each entry while($entryName = readdir($directory)) { if(is_dir($entryName) && $entryName != "." && $entryName != ".."){ $folderArray[] = str_replace($inputDirectory, "", $entryName); } $ext = explode(".", $entryName); if(!empty($ext[1])){ $dirArray[] = $docRoot.$inputDirectory."/".$entryName; } } // close directory closedir($directory); $found = false; if(is_array($dirArray)){ foreach($dirArray as $current){ $myFile = file_get_contents($current); $myFile = str_replace("<?php", "", $myFile); $myFile = str_replace("?>", "", $myFile); if(preg_match("/function ".$function."/", $myFile)){ $found = true; $foundLocation = $current; break; } } } if($found){ echo $foundLocation; exit; } else if(is_array($folderArray)){ foreach($folderArray as $folder){ if(!isset($return)){ $return = findFunction($function, $inputDirectory."/".$folder); } else if($return == false){ $return = findFunction($function, $inputDirectory."/".$folder); } } } else { return false; } } findFunction("testFunction", "rootDirectory");
Надеюсь, это кому-то поможет. Если фактическая функция находится за пределами httpdocs, то ее нельзя найти, потому что сервер настроен так, чтобы ее не разрешать. Проверял его только на одну папку в глубину, но рекурсивная методология должна работать теоретически.
Это похоже на версию 0.1, но я не собираюсь продолжать ее разработку, поэтому, если кто-то обновит ее, не стесняйтесь репостить ее.
источник
function ff() { grep "function $1" $(find ./ -name "*.php") }
затем вызовитеff fail
илиff epic
. см .: github.com/MaerF0x0/VimSetup/blob/master/bashrc#L122