여러분은 내가 함수 내에서 호출 된 함수가 무엇인지 확인할 수 있습니까?PHP로 함수가 호출 된 위치를 결정하십시오.
내가 debug_backtrace를 사용하는 생각을했다 ..하지만 그것을 할 우아한 방법으로 보이지 않는다, 그들은 다른 대안이 무엇인지 또 다른 질문 그래서 here
다른 이유를 enumarate?
덕분에 많은
여러분은 내가 함수 내에서 호출 된 함수가 무엇인지 확인할 수 있습니까?PHP로 함수가 호출 된 위치를 결정하십시오.
내가 debug_backtrace를 사용하는 생각을했다 ..하지만 그것을 할 우아한 방법으로 보이지 않는다, 그들은 다른 대안이 무엇인지 또 다른 질문 그래서 here
다른 이유를 enumarate?
덕분에 많은
debug_backtrace()
은 호출자를 결정하는 유일한 방법입니다. 물론 매개 변수로 해당 정보를 전달해야합니다.
참고 : 은이 기본값을 사용하여 수행 할 수 없습니다. 예컨대 : 항상 같은 값을해야합니다 있도록
function f($param1, $param2, $caller=__FUNCTION__) ...
__FUNCTION__
이, 구문 분석 시간에 평가됩니다. 범위 f
이 선언 된 함수입니다.
어디 선가에서 몇 시간 전에이 코드를 빌려 그것은 debug_backtrace()를 사용하여 매력처럼 작동합니다. 유용하다고 생각하길 바랍니다.
function backtrace(){
$backtrace = debug_backtrace();
$output = '';
foreach ($backtrace as $bt) {
$args = '';
foreach ($bt['args'] as $a) {
if (!empty($args)) {
$args .= ', ';
}
switch (gettype($a)) {
case 'integer':
case 'double':
$args .= $a;
break;
case 'string':
//$a = htmlspecialchars(substr(, 0, 64)).((strlen($a) > 64) ? '...' : '');
$args .= "\"$a\"";
break;
case 'array':
$args .= 'Array('.count($a).')';
break;
case 'object':
$args .= 'Object('.get_class($a).')';
break;
case 'resource':
$args .= 'Resource('.strstr($a, '#').')';
break;
case 'boolean':
$args .= $a ? 'TRUE' : 'FALSE';
break;
case 'NULL':
$args .= 'Null';
break;
default:
$args .= 'Unknown';
}
}
$output .= '<br />';
$output .= '<b>file:</b> '[email protected]$bt['file'].' - line '[email protected]$bt['line'].'<br />';
$output .= '<b>call:</b> '[email protected]$bt['class'][email protected]$bt['type'][email protected]$bt['function'].'('.$args.')<br />';
}
return $output;
}
나는 debug_backtrace 함수를 사용하기위한 대안을 찾고있다. –
그렇다면 debug_backtrace가 출력을 못생긴 것으로 문제를 이해 했으므로 질문을 다시 말해야한다고 생각합니다. 어쨌든, 나는 debug_backtrace에 대한 간단한 대안이 없다고 생각합니다 ... – Seb
거기에는 다양한 옵션이 없습니다. (다른 질문에 게시했습니다) 또 다른 옵션은 함수 호출 (사용 PHP 마법 상수)와 정보의 provde하는 호출자를 강제로 :
callFunction(1, 2, 3, __FUNCTION__)
callFunction(1, 2, 3, __CLASS__, __METHOD__)
callFunction(1, 2, 3, $this, __METHOD__)
or
$class = new ReflectionClass(__CLASS__);
$method = $class->getMethod(__METHOD__);
callFunction(1, 2, 3, $method) // $method would be a ReflectionMethod obj
이 가능한 대안이 될 것입니다. 그러나
callFunction
의 코드를 일으킬 수 있으며이 이러한 오류를 추적하는 것은 매우 어려울 것이다 "조작"할 수있는 코드 난독
내가 당신 자리에 있었다면 코드 전체에서 사용되는 기능에서 피하려고했습니다. debug_backtrace
을 사용하십시오 ('느린'경우 일지라도). 읽을 수있는 코드가 빠른 코드에서 승리합니다.
디버깅 용도로 사용하는 경우 예외를 throw하고 catch 함수가 catch 스택에서 호출하는 함수를 인쇄 할 수 있습니다.
여기 미키 마우스 대원의 반응은 온라인 PHP 커뮤니티의 전형입니다! 대답을 나누는 대신에, 왜 당신이 그것을 필요로하는지 묻습니다. solomongaby가 올바른 질문을하고 있다는 사실을 염두에 두지 마십시오. 표준 IDE와 Java 및 Objective-C와 같은보다 전문적인 언어를 사용하는 것이 정상적인 기능입니다.
Solomongaby, 이것은 당신이 필요로 무엇을 얻을 수있는 가장 간단한 방법은 다음과 같습니다
$bt = debug_backtrace();
$end = end($bt);
var_dump($end['class']); //or var_dump($end['file']);
왜 당신은 현재 함수가 호출 된 곳에서 알아야 할 것은 무엇? 연결된 질문 에서처럼 함수가 실제로 누가 호출했는지 알아야하는 경우 디자인을 다시 생각해야합니다. – Gumbo
나는보기 클래스가 있고보기의 전체 경로를 지정하지 않고 이름 만 입력하면보기를 클래스를 호출 한보기와 같은 디렉토리에 위치시킵니다. –
발을 쏠듯한 느낌입니다. 그러지 마. – troelskn