代码之家  ›  专栏  ›  技术社区  ›  Carson Myers

获取PHP中函数调用方的\文件\常量

php
  •  12
  • Carson Myers  · 技术社区  · 15 年前

    我知道 __FILE__ PHP中的magic常量将转换为当前执行文件的完整路径和文件名。但是有没有一种方法可以为函数的调用文件获取相同的信息?例如:

    //foo.php:
    include "bar.php";
    call_it();
    
    //bar.php
    function call_it() {
        echo "Calling file: ".__CALLING_FILE__;
    }
    

    哪个会输出 Calling file: ....../foo.php .

    我知道没有 __CALLING_FILE__ 魔法常数,或者处理这个的魔法常数,但是我有没有办法得到这个信息?最简单的解决方案是理想的(例如,使用堆栈跟踪非常简单),但最终我只需要它来工作。

    2 回复  |  直到 15 年前
        1
  •  24
  •   RageZ    15 年前

    您应该查看堆栈跟踪来执行这些操作。PHP有一个函数 debug_backtrace

    include "bar.php";
    call_it();
    
    //bar.php
    function call_it() {
       $bt =  debug_backtrace();
    
       echo "Calling file: ". $bt[0]['file'] . ' line  '. $bt[0]['line'];
    }
    

    希望它有帮助

    按照你能找到的同样的原则 debug_print_backtrace 有用的是,它做同样的事情,但是PHP自己处理所有信息的格式化和打印。

        2
  •  3
  •   Ivan Krechetov    15 年前

    debug_backtrace() 是你的朋友吗

    这就是我们用来转储 现在的 线。要根据您的情况进行调整,请忽略 $trace 数组。

    class Util_Debug_ContextReader {
        private static function the_trace_entry_to_return() {
            $trace = debug_backtrace();
    
            for ($i = 0; $i < count($trace); ++$i) {
                if ('debug' == $trace[$i]['function']) {
                    if (isset($trace[$i + 1]['class'])) {
                        return array(
                            'class' => $trace[$i + 1]['class'],
                            'line' => $trace[$i]['line'],
                        );
                    }
    
                    return array(
                        'file' => $trace[$i]['file'],
                        'line' => $trace[$i]['line'],
                    );
                }
            }
    
            return $trace[0];
        }
    
        /**
         * @return string
         */
        public function current_module() {
            $trace_entry = self::the_trace_entry_to_return();
    
            if (isset($trace_entry['class']))
                return 'class '. $trace_entry['class'];
            else
                return 'file '. $trace_entry['file'];
    
            return 'unknown';
        }
    
        public function current_line_number() {
            $trace_entry = self::the_trace_entry_to_return();
            if (isset($trace_entry['line'])) return $trace_entry['line'];
            return 'unknown';
        }
    }