PHP에서 호출 함수/메서드의 이름을 얻는 방법은?
을 .debug_backtrace
,, 음, 음, 음, 음, 다, 다, 다, 다, 다, ,, ,, to 등의 기능을 구현할 수 있는 기능을 찾고 .GetCallingMethodName()
방법
가장 간단한 방법은 다음과 같습니다.
echo debug_backtrace()[1]['function'];
아래 코멘트에서 설명한 바와 같이 이는 인수를 전달함으로써 더욱 최적화될 수 있습니다.
- 다
object
★★★★★★★★★★★★★★★★★」args
- 반환되는 스택프레임 수 제한
echo debug_backtrace(!DEBUG_BACKTRACE_PROVIDE_OBJECT|DEBUG_BACKTRACE_IGNORE_ARGS,2)[1]['function'];
debug_backtrace()
알 수 있는 가 하나 더 .게을러진다면, 이것은 코드화할 필요가 있는 또 하나의 이유입니다.GetCallingMethodName()
네 자신.게으름에 맞서라! :D.
php 5.4를 사용하실 수 있습니다.
$dbt=debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS,2);
$caller = isset($dbt[1]['function']) ? $dbt[1]['function'] : null;
이렇게 하면 인수를 무시하고 마지막 2개의 백트레이스 스택엔트리만 반환되므로 메모리가 낭비되지 않습니다.또, 여기서의 다른 응답으로서 통지가 생성되지 않습니다.
php 예외에 의해 제공되는 정보를 사용할 수도 있습니다.이것은 우아한 솔루션입니다.
함수 GetCallingMethodName(){$e = 새로운 예외();$sec = $e-> getTrace();//위치 0은 이 함수를 호출한 회선이므로 무시합니다.$last_call = $last[1]; print_r'last_call); } firstCall 함수($a, $b){더콜($a, $b);} 함수 theCall($a, $b){GetCallingMethodName();} first Call('lucia', 'php');
그리고 당신은 이걸...(부라!)
어레이([파일] => /home/lufigueroa/데스크탑/테스트.php[line] => 12[기능] => 통화[backs] => 어레이([0] => 루시아[1] => php) )
는 ★★★★★★★★★★★★★★★★★★.debug_backtrace
메모리의 한계에 도달하고 있어, 에러가 발생했을 때의 로그나 E-메일을 실전 가동에 사용하고 싶다고 생각하고 있습니다.
대신 이 솔루션이 훌륭하게 작동했습니다!
// Make a new exception at the point you want to trace, and trace it!
$e = new Exception;
var_dump($e->getTraceAsString());
// Outputs the following
#2 /usr/share/php/PHPUnit/Framework/TestCase.php(626): SeriesHelperTest->setUp()
#3 /usr/share/php/PHPUnit/Framework/TestResult.php(666): PHPUnit_Framework_TestCase->runBare()
#4 /usr/share/php/PHPUnit/Framework/TestCase.php(576): PHPUnit_Framework_TestResult->run(Object(SeriesHelperTest))
#5 /usr/share/php/PHPUnit/Framework/TestSuite.php(757): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult))
#6 /usr/share/php/PHPUnit/Framework/TestSuite.php(733): PHPUnit_Framework_TestSuite->runTest(Object(SeriesHelperTest), Object(PHPUnit_Framework_TestResult))
#7 /usr/share/php/PHPUnit/TextUI/TestRunner.php(305): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false)
#8 /usr/share/php/PHPUnit/TextUI/Command.php(188): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array)
#9 /usr/share/php/PHPUnit/TextUI/Command.php(129): PHPUnit_TextUI_Command->run(Array, true)
#10 /usr/bin/phpunit(53): PHPUnit_TextUI_Command::main()
#11 {main}"
내가 제일 좋아하는 방법, 한 줄로!
debug_backtrace()[1]['function'];
다음과 같이 사용할 수 있습니다.
echo 'The calling function: ' . debug_backtrace()[1]['function'];
이는 지난해 출시된 PHP 버전과만 호환된다는 점에 유의하십시오.그러나 보안상의 이유로 PHP를 최신 상태로 유지하는 것이 좋습니다.
방금 'get_caller'라는 버전을 썼는데 도움이 됐으면 좋겠어요.저는 게을러요.함수에서 get_caller()만 실행할 수 있습니다.이렇게 지정할 필요는 없습니다.
get_caller(__FUNCTION__);
다음은 기발한 테스트 케이스가 포함된 스크립트입니다.
<?php
/* This function will return the name string of the function that called $function. To return the
caller of your function, either call get_caller(), or get_caller(__FUNCTION__).
*/
function get_caller($function = NULL, $use_stack = NULL) {
if ( is_array($use_stack) ) {
// If a function stack has been provided, used that.
$stack = $use_stack;
} else {
// Otherwise create a fresh one.
$stack = debug_backtrace();
echo "\nPrintout of Function Stack: \n\n";
print_r($stack);
echo "\n";
}
if ($function == NULL) {
// We need $function to be a function name to retrieve its caller. If it is omitted, then
// we need to first find what function called get_caller(), and substitute that as the
// default $function. Remember that invoking get_caller() recursively will add another
// instance of it to the function stack, so tell get_caller() to use the current stack.
$function = get_caller(__FUNCTION__, $stack);
}
if ( is_string($function) && $function != "" ) {
// If we are given a function name as a string, go through the function stack and find
// it's caller.
for ($i = 0; $i < count($stack); $i++) {
$curr_function = $stack[$i];
// Make sure that a caller exists, a function being called within the main script
// won't have a caller.
if ( $curr_function["function"] == $function && ($i + 1) < count($stack) ) {
return $stack[$i + 1]["function"];
}
}
}
// At this stage, no caller has been found, bummer.
return "";
}
// TEST CASE
function woman() {
$caller = get_caller(); // No need for get_caller(__FUNCTION__) here
if ($caller != "") {
echo $caller , "() called " , __FUNCTION__ , "(). No surprises there.\n";
} else {
echo "no-one called ", __FUNCTION__, "()\n";
}
}
function man() {
// Call the woman.
woman();
}
// Don't keep him waiting
man();
// Try this to see what happens when there is no caller (function called from main script)
//woman();
?>
get_calling get_calling()을 호출하는 woman()은 woman()이 주의를 기울여서 알리지 않았기 때문에 get_calling get_calling()을 호출한 woman()을 호출한 woman()을 아직 호출한 사람이 누구인지 알 수 없습니다.그런 다음 누가 woman()을 호출했는지 반환합니다.또한 브라우저의 소스 코드 모드의 출력에는 함수 스택이 표시됩니다.
Printout of Function Stack:
Array
(
[0] => Array
(
[file] => /Users/Aram/Development/Web/php/examples/get_caller.php
[line] => 46
[function] => get_caller
[args] => Array
(
)
)
[1] => Array
(
[file] => /Users/Aram/Development/Web/php/examples/get_caller.php
[line] => 56
[function] => woman
[args] => Array
(
)
)
[2] => Array
(
[file] => /Users/Aram/Development/Web/php/examples/get_caller.php
[line] => 60
[function] => man
[args] => Array
(
)
)
)
man() called woman(). No surprises there.
호출 클래스/메서드(Magento 프로젝트 작업)만 나열할 수 있는 것이 필요했습니다.
하는 동안에debug_backtrace
수많은 유용한 정보를 제공합니다.Magento 설치를 위해 쏟아낸 정보의 양은 압도적입니다(82,000 회선이 넘습니다).저는 호출 기능과 클래스에만 관심이 있었기 때문에 다음과 같은 작은 해결책을 마련했습니다.
$callers = debug_backtrace();
foreach( $callers as $call ) {
echo "<br>" . $call['class'] . '->' . $call['function'];
}
부모 함수명을 취득하는 가장 간단한 방법은 다음과 같습니다.
$caller = next(debug_backtrace())['function'];
내가 본 질문의 가장 좋은 답은 다음과 같다.
list(, $caller) = debug_backtrace(false);
짧고 깔끔함
언급URL : https://stackoverflow.com/questions/2110732/how-to-get-name-of-calling-function-method-in-php
'IT' 카테고리의 다른 글
MySQL을 사용하는 float(24) 열에 필요한 스토리지 크기는 어떻게 됩니까? (0) | 2022.11.18 |
---|---|
MySQL에서는 숫자를 인용해야 하나요, 말아야 하나요? (0) | 2022.11.18 |
고정 헤더가 있는 HTML 테이블? (0) | 2022.11.18 |
'x'가 'x' == 'x'보다 빠른 이유는 무엇입니까? (0) | 2022.11.18 |
Printf는 문장의 첫 글자만 표시합니다. (0) | 2022.11.18 |