php中的动态访问魔术常量

时间:2010-03-19 13:01:45

标签: php

有没有办法快捷:

function a($where){
  echo $where;
}

function b(){
  a(basename(__FILE__).'::'.__FUNCTION__.'()::'.__LINE__);
}

这样的事情:

    define("__myLocation__", ''.basename(__FILE__).'::'.__FUNCTION__.'()::'.__LINE__.'');
    function a($where){
      echo $where;
    }

    function b(){
      a(__mYLocation_);
    }

我知道这不能用常量来完成(这只是一个理论上的例子),但我找不到缩短代码的方法。如果使用函数来获取我的行,它将获得该函数不是调用函数的行的行。

我通常调用一个直接打印到日志文件的函数,但在我的日志中我需要知道调用函数的位置,所以我使用basename(__FILE__).'::'.__FUNCTION__.'()::'.__LINE__这将打印如下内容:

index.php::b()::6

当你在不同的文件中有超过500个函数时,会有很多代码。有没有缩短或更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

debug_backtrace()应该可以帮到你,虽然我不知道你切割的每个日志会对它进行调用会有什么影响。试试这个:

function cut_log() {
    $trace = debug_backtrace();
    echo basename($trace[1]['file']) . '::' . $trace[1]['function']
         . '::' . $trace[1]['line'];
}

function a() {
    cut_log();
}

a();

答案 1 :(得分:0)

呃..我想你可以用eval和那个常数做到这一点。

define("__myLocation__", "''.basename(__FILE__).'::'.__FUNCTION__.'()::'.__LINE__.''");
function a($where){
  echo $where;
}

function b(){
  a(eval(__myLocation__));
}

但你真的不应该使用eval来做任何事情。