2009-04-13 5 views
5

여러분은 내가 함수 내에서 호출 된 함수가 무엇인지 확인할 수 있습니까?PHP로 함수가 호출 된 위치를 결정하십시오.

내가 debug_backtrace를 사용하는 생각을했다 ..하지만 그것을 할 우아한 방법으로 보이지 않는다, 그들은 다른 대안이 무엇인지 또 다른 질문 그래서 here

다른 이유를 enumarate?

덕분에 많은

+0

왜 당신은 현재 함수가 호출 된 곳에서 알아야 할 것은 무엇? 연결된 질문 에서처럼 함수가 실제로 누가 호출했는지 알아야하는 경우 디자인을 다시 생각해야합니다. – Gumbo

+0

나는보기 클래스가 있고보기의 전체 경로를 지정하지 않고 이름 만 입력하면보기를 클래스를 호출 한보기와 ​​같은 디렉토리에 위치시킵니다. –

+0

발을 쏠듯한 느낌입니다. 그러지 마. – troelskn

답변

2

debug_backtrace()은 호출자를 결정하는 유일한 방법입니다. 물론 매개 변수로 해당 정보를 전달해야합니다.

참고 : 이 기본값을 사용하여 수행 할 수 없습니다. 예컨대 : 항상 같은 값을해야합니다 있도록

function f($param1, $param2, $caller=__FUNCTION__) ... 

__FUNCTION__이, 구문 분석 시간에 평가됩니다. 범위 f이 선언 된 함수입니다.

3

어디 선가에서 몇 시간 전에이 코드를 빌려 그것은 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; 
} 
+0

나는 debug_backtrace 함수를 사용하기위한 대안을 찾고있다. –

+1

그렇다면 debug_backtrace가 출력을 못생긴 것으로 문제를 이해 했으므로 질문을 다시 말해야한다고 생각합니다. 어쨌든, 나는 debug_backtrace에 대한 간단한 대안이 없다고 생각합니다 ... – Seb

1

거기에는 다양한 옵션이 없습니다. (다른 질문에 게시했습니다) 또 다른 옵션은 함수 호출 (사용 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을 사용하십시오 ('느린'경우 일지라도). 읽을 수있는 코드가 빠른 코드에서 승리합니다.

  • 0

    디버깅 용도로 사용하는 경우 예외를 throw하고 catch 함수가 catch 스택에서 호출하는 함수를 인쇄 할 수 있습니다.

    3

    여기 미키 마우스 대원의 반응은 온라인 PHP 커뮤니티의 전형입니다! 대답을 나누는 대신에, 왜 당신이 그것을 필요로하는지 묻습니다. solomongaby가 올바른 질문을하고 있다는 사실을 염두에 두지 마십시오. 표준 IDE와 Java 및 Objective-C와 같은보다 전문적인 언어를 사용하는 것이 정상적인 기능입니다.

    Solomongaby, 이것은 당신이 필요로 무엇을 얻을 수있는 가장 간단한 방법은 다음과 같습니다

    $bt = debug_backtrace(); 
    $end = end($bt); 
    var_dump($end['class']); //or var_dump($end['file']); 
    
    관련 문제