2009-04-13 29 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

    これはデバッグのためのものですが、例外をスローして関数スタックにcatchする場所にスタックを呼び出すことができます。

    3

    ここでのミッキーマウスのクルーの反応は、オンラインのPHPコミュニティの典型です!答えを共有する代わりに、彼らはあなたにそれが必要な理由を尋ねます。 solomongabyが正当な質問をしてくれていることに気をつけてください。標準的なIDEやJavaやObjective-Cのようなより専門的な言語では普通の機能です。

    Solomongaby、これはあなたが必要なものを取得する最も簡単な方法は次のとおりです。

    $bt = debug_backtrace(); 
    $end = end($bt); 
    var_dump($end['class']); //or var_dump($end['file']); 
    
    関連する問題