在PHP函数中获取调用范围?

时间:2011-07-14 17:22:33

标签: php scope

我可以从被调用的函数中访问调用环境的范围吗?

例如,我想在日志记录功能中访问__LINE__,但它必须是来自调用环境的__LINE__。我还想通过某种方式调用get_defined_vars()来获取调用者变量。

在两个例子中,它都可以节省额外的参数。

这可能吗?

2 个答案:

答案 0 :(得分:1)

没有办法让打电话的人'变量,但你可以得到他们的论点。使用debug_backtrace()

可以轻松完成此操作
<?php

class DebugTest
{
    public static function testFunc($arg1, $arg2) {
        return self::getTrace();
    }

    private static function getTrace() {
        $trace = debug_backtrace();
        return sprintf(
            "This trace function was called by %s (%s:%d) with %d %s: %s\n",
            $trace[1]["function"],
            $trace[1]["file"],
            $trace[1]["line"],
            count($trace[1]["args"]),
            count($trace[1]["args"]) === 1 ? "argument" : "arguments",
            implode(", ", $trace[1]["args"])
        );
    }
}

echo DebugTest::testFunc("foo", "bar");

运行此程序,我们得到此输出:

This trace function was called by testFunc (/Users/mike/debug.php:23) with 2 arguments: foo, bar

debug_backtrace()返回一个数组;元素0是函数本身被调用的函数,因此我们在示例中使用元素1。您可以使用循环一直向前移动轨迹。

答案 1 :(得分:0)

排序,但不是在生产代码中使用的明智之处。

  

在两个例子中,它都可以节省额外的参数。

这会使你的代码很难理解,因为你会破坏函数所隐含的封装。

大家都说过,你可以使用全局变量吗?