PHP에서 호출자 함수의 이름을 가져오시겠습니까?
특정 함수에 있는 호출자 함수의 이름을 알아내는 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
Ubuntu에 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'];
또는 최적화된 경우(예: 비디버깅 사용 사례):
echo debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
첫 번째 인수는 미사용 함수 인수에 대한 입력을 금지하고 두 번째 인수는 트레이스를 2가지 레벨로 제한합니다(두 번째 인수가 필요합니다).
이걸 직접 만들어서 사용했어요.
/**
* 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의 방식은 발신자가 아닌 호출된 함수명을 항상 반환하기 때문에 함수로 기능하지 않는다고 말하고 싶었을 뿐이지만, 코멘트를 할 만한 평판은 없습니다.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..
}
debug_backtrace에 의해 반환된 어레이에서 이 정보를 추출할 수 있습니다.
이 방법이 가장 효과적이었어var_dump(debug_backtrace());
실제로 debug_print_backtrace()는 필요한 기능을 수행합니다.http://php.net/manual/en/function.debug-print-backtrace.php
이 조작은 유효합니다.
$caller = next(debug_backtrace())['function'];
이것으로 충분합니다.
// Outputs an easy to read call trace
// Credit: https://www.php.net/manual/en/function.debug-backtrace.php#112238
// Gist: https://gist.github.com/UVLabs/692e542d3b53e079d36bc53b4ea20a4b
Class MyClass{
public function generateCallTrace()
{
$e = new Exception();
$trace = explode("\n", $e->getTraceAsString());
// reverse array to make steps line up chronologically
$trace = array_reverse($trace);
array_shift($trace); // remove {main}
array_pop($trace); // remove call to this method
$length = count($trace);
$result = array();
for ($i = 0; $i < $length; $i++)
{
$result[] = ($i + 1) . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
}
return "\t" . implode("\n\t", $result);
}
}
// call function where needed to output call trace
/**
Example output:
1) /var/www/test/test.php(15): SomeClass->__construct()
2) /var/www/test/SomeClass.class.php(36): SomeClass->callSomething()
**/```
사용자가 읽을 수 있는 방법으로 발신자 메서드의 트레이스를 보고 싶은 많은 사람에게 도움이 되는 범용 클래스를 만들었습니다.내 프로젝트 중 하나에서와 마찬가지로 우리는 그러한 정보를 기록해야 했다.
use ReflectionClass;
class DebugUtils
{
/**
* Generates debug traces in user readable form
*
* @param integer $steps
* @param boolean $skipFirstEntry
* @param boolean $withoutNamespaces
* @return string
*/
public static function getReadableBackTracke(
$steps = 4,
$skipFirstEntry = true,
$withoutNamespaces = true
) {
$str = '';
try {
$backtrace = debug_backtrace(false, $steps);
// Removing first array entry
// to make sure getReadableBackTracke() method doesn't gets displayed
if ($skipFirstEntry)
array_shift($backtrace);
// Reserved, so it gets displayed in calling order
$backtrace = array_reverse($backtrace);
foreach ($backtrace as $caller) {
if ($str) {
$str .= ' --> ';
}
if (isset($caller['class'])) {
$class = $caller['class'];
if ($withoutNamespaces) {
$class = (new ReflectionClass($class))->getShortName();
}
$str .= $class . $caller['type'];
}
$str .= $caller['function'];
}
} catch (\Throwable $th) {
return null;
}
return $str;
}
}
사용방법:DebugUtils::getReadableBackTracke()
샘플 출력:
SomeClass->method1 --> SomeOtherClass->method2 --> TargetClass->targetMethod
좋은 일을 하고 다른 사람을 계속 도와라, 행복한 코딩:)
언급URL : https://stackoverflow.com/questions/190421/get-name-of-caller-function-in-php
'programing' 카테고리의 다른 글
MySQL 테이블에 이미지를 삽입하면 NULL이 됩니다. (0) | 2022.09.18 |
---|---|
VueX에서 계산된 속성을 감시하는 Vue 워처를 테스트하려면 어떻게 해야 합니까? (0) | 2022.09.18 |
SQL IN() 절의 값 순서로 정렬 (0) | 2022.09.18 |
장고 템플릿 변수 및 Javascript (0) | 2022.09.18 |
Vue 구성 요소에서 서드파티 Javascript 라이브러리 사용 (0) | 2022.09.18 |