代码之家  ›  专栏  ›  技术社区  ›  Gabriel Solomon

确定用PHP调用函数的位置

php
  •  5
  • Gabriel Solomon  · 技术社区  · 15 年前

    你们知道我如何从函数内部调用的函数的文件中确定它是什么吗?

    我在考虑使用debug_backtrace..但这看起来并不是一种优雅的方式,而且在另一个问题中,他们也列举了其他的原因。 here

    那么还有什么其他的选择呢?

    谢谢

    5 回复  |  直到 14 年前
        1
  •  2
  •   vartec    15 年前

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

    注意,那就是你 不能 使用默认值执行此操作。例如。:

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

    __FUNCTION__ 将在分析时进行计算,因此它始终具有相同的值。作用域中的函数 f 声明。

        2
  •  3
  •   Seb    15 年前

    我前段时间从某个地方借用了这段代码,它的工作方式就像是使用 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;
    }
    
        3
  •  3
  •   PostCodeism    14 年前

    米奇鼠标组在这里的响应是典型的在线PHP社区!他们没有分享答案,而是问你为什么需要答案。别担心SoLoMunaby问一个有效的问题,这在标准IDE和更专业的语言(如Java和Objto-C)中是一个非常正常的特性。

    所罗门加比,这是最简单的方法,让你得到你需要的:

    $bt = debug_backtrace();
    $end = end($bt);
    var_dump($end['class']); //or var_dump($end['file']);
    
        4
  •  1
  •   Marcel Jackwerth    15 年前

    你在那里没有很多选择。另一个选项(在另一个问题中发布)强制调用者使用函数调用(使用php magic常量)提供信息:

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

        5
  •  0
  •   Itay Moav -Malimovka    15 年前

    如果这是为了调试,您可以抛出一个异常,并在捕获它的地方打印函数调用堆栈。