주어진 함수에서 호출자 함수의 이름을 찾는 PHP 함수가 있습니까?
답변
debug_backtrace를 참조하십시오. 이렇게하면 콜 스택을 맨 위까지 추적 할 수 있습니다.
발신자를 얻는 방법은 다음과 같습니다.
$trace = debug_backtrace();
$caller = $trace[1];
echo "Called by {$caller['function']}";
if (isset($caller['class']))
echo " in {$caller['class']}";
답변
Xdebug는 훌륭한 기능을 제공합니다.
<?php
Class MyClass
{
function __construct(){
$this->callee();
}
function callee() {
echo sprintf("callee() called @ %s: %s from %s::%s",
xdebug_call_file(),
xdebug_call_line(),
xdebug_call_class(),
xdebug_call_function()
);
}
}
$rollDebug = new MyClass();
?>
추적을 반환합니다
callee() called @ /var/www/xd.php: 16 from MyClass::__construct
우분투에 Xdebug를 설치하는 가장 좋은 방법은
sudo aptitude install php5-xdebug
먼저 php5-dev를 설치해야 할 수도 있습니다
sudo aptitude install php5-dev
답변
이것은 매우 늦었지만 현재 함수가 호출되는 함수의 이름을 제공하는 함수를 공유하고 싶습니다.
public function getCallingFunctionName($completeTrace=false)
{
$trace=debug_backtrace();
if($completeTrace)
{
$str = '';
foreach($trace as $caller)
{
$str .= " -- Called by {$caller['function']}";
if (isset($caller['class']))
$str .= " From Class {$caller['class']}";
}
}
else
{
$caller=$trace[2];
$str = "Called by {$caller['function']}";
if (isset($caller['class']))
$str .= " From Class {$caller['class']}";
}
return $str;
}
이것이 도움이 되길 바랍니다.
답변
debug_backtrace()
현재 호출 스택에서 매개 변수, 함수 / 방법 호출에 대한 세부 사항을 제공합니다.
답변
echo debug_backtrace()[1]['function'];
PHP 5.4 부터 작동합니다 .
또는 최적화 (예 : 비디 버그 사용 사례) :
echo debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
첫 번째 인수는 사용되지 않은 함수 인수를 채우지 못하게하고 두 번째 인수는 추적을 두 레벨로 제한합니다 (두 번째가 필요함).
답변
이것을 만들고 이것을 직접 사용
/**
* Gets the caller of the function where this function is called from
* @param string what to return? (Leave empty to get all, or specify: "class", "function", "line", "class", etc.) - options see: http://php.net/manual/en/function.debug-backtrace.php
*/
function getCaller($what = NULL)
{
$trace = debug_backtrace();
$previousCall = $trace[2]; // 0 is this call, 1 is call in previous function, 2 is caller of that function
if(isset($what))
{
return $previousCall[$what];
}
else
{
return $previousCall;
}
}
답변
플로어의 방법은 항상 호출자 대신 호출 된 함수 이름을 반환하기 때문에 함수로 작동하지 않는다고 말하고 싶었지만 주석으로 평판을 얻지 못했습니다. 내 경우에 잘 작동하는 flori의 답변을 기반으로 매우 간단한 기능을 만들었습니다.
class basicFunctions{
public function getCallerFunction(){
return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]['function'];
}
}
예:
function a($authorisedFunctionsList = array("b")){
$ref = new basicFunctions;
$caller = $ref->getCallerFunction();
if(in_array($caller,$authorisedFunctionsList)):
echo "Welcome!";
return true;
else:
echo "Unauthorised caller!";
return false;
endif;
}
function b(){
$executionContinues = $this->a();
$executionContinues or exit;
//Do something else..
}