php:确定从哪里调用函数

有没有一种方法可以找出PHP中的函数是从哪里调用的? 例:

function epic() { fail(); } function fail() { //at this point, how do i know, that epic() has called this function? } 

你可以使用debug_backtrace()

例:

 <?php function epic( $a, $b ) { fail( $a . ' ' . $b ); } function fail( $string ) { $backtrace = debug_backtrace(); print_r( $backtrace ); } epic( 'Hello', 'World' ); 

输出:

 Array ( [0] => Array ( [file] => /Users/romac/Desktop/test.php [line] => 5 [function] => fail [args] => Array ( [0] => Hello World ) ) [1] => Array ( [file] => /Users/romac/Desktop/test.php [line] => 15 [function] => epic [args] => Array ( [0] => Hello [1] => World ) ) ) 

使用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()... } } 

所以如果你还真的不知道怎么解决这个问题,

 $backtrace = debug_backtrace(); echo 'Mu name is '.$backtrace[1]['function'].', and I have called him! Muahahah!'; 

我find最快最简单的解决scheme

 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] => -> ) ) 

笔者testing联想笔记本的速度:Intel Pentiom CPU N3530 2.16GHz,内存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 

使用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"); 

希望它有助于某人。 如果实际的function在httpdocs之外,那么它不能被find,因为服务器将被设置为不允许它。 只testing了一个文件夹,但recursion方法论应该在理论上工作。

这就像0.1版本,但我不打算继续开发它,所以如果有人更新它可以随时重新发布。