确定使用PHP调用函数的位置

时间:2009-04-13 11:54:31

标签: php

你们知道我怎样才能确定哪个文件是该函数内部调用的函数?

我正在考虑使用debug_backtrace ..但这看起来并不是一种优雅的方式,而且还会在另一个问题中引发其他原因here

那么还有其他替代方案吗?

非常感谢

5 个答案:

答案 0 :(得分: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> '.@$bt['file'].' - line '.@$bt['line'].'<br />';
        $output .= '<b>call:</b> '.@$bt['class'].@$bt['type'].@$bt['function'].'('.$args.')<br />';
    }
    return $output;
}

答案 1 :(得分:3)

米老鼠工作人员的回复是在线PHP社区的典型代表!他们没有分享答案,而是问你为什么需要它。没关系solomongaby问一个有效的问题,这是一个非常正常的功能,有标准的IDE和更专业的语言,如Java和Objective-C。

Solomongaby,这是满足您需求的最简单方式:

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

答案 2 :(得分:2)

在函数debug_backtrace()内是确定调用者的唯一方法,除非您将该信息作为参数传递。

注意,您不能使用默认值来执行此操作。 E.g:

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

__FUNCTION__将在分析时进行评估,因此它将始终具有相同的值。声明范围f的函数。

答案 3 :(得分:1)

那里你没有多少选择。另一个选项(在另一个问题中发布)强制调用者使用函数调用来提供它的信息(使用PHP魔术常量):

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(即使它可能'慢')。可读代码胜过快速代码。

答案 4 :(得分:0)

如果这是出于调试目的,您可以抛出异常,并在捕获它的位置打印函数调用堆栈。