Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的动态访问魔法常量_Php - Fatal编程技术网

php中的动态访问魔法常量

php中的动态访问魔法常量,php,Php,有没有一种快捷方式可以做到这一点: function a($where){ echo $where; } function b(){ a(basename(__FILE__).'::'.__FUNCTION__.'()::'.__LINE__); } 对这样的事情: define("__myLocation__", ''.basename(__FILE__).'::'.__FUNCTION__.'()::'.__LINE__.''); function a($wher

有没有一种快捷方式可以做到这一点:

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(uuu file_uu)。::'。u function_u。():'。u LINE_u
这将打印如下内容:

index.php::b()::6

当您在不同的文件中有500多个函数时,代码会非常多。有没有缩短或更好的方法。。我想你可以用eval和那个常数

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

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

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

Ehh。。我想你可以用eval和那个常数

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

function b(){
  a(eval(__myLocation__));
}
但是你真的不应该在任何事情上使用eval。

debug\u backtrace()应该会对你有所帮助,尽管我不知道在你剪切的每一个日志中调用eval会对性能造成什么影响。试试这个:

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

function a() {
    cut_log();
}

a();
debug_backtrace()应该会对您有所帮助,尽管我不知道在您剪切的每个日志中调用它会对性能造成什么影响。试试这个:

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

function a() {
    cut_log();
}

a();

它用于记录所有内容:信息(用户所做的操作,如果它正在更改应用程序)、调试消息(如果调试处于启用状态)、警告和错误。请参阅此处,它也用于记录所有内容:信息(用户所做的操作,如果它正在更改应用程序)、调试消息(如果调试处于启用状态)、警告,和错误。在这里也可以看到@Gordon,
debug\u backtrace
不会增加太多开销。我想说,如果它有效,就使用它。@mattbasta这不是开销,而是原则。这是一个调试函数,主要用于错误处理。它不应该被误用来获取关于调用方对象的信息,除非它用于调试,而日志记录则不是。请参阅和@Gordon这似乎是使用
debug\u backtrace
的一个非常合适的地方。即使这不是错误,谁在乎呢?它返回op需要的信息,并快速执行。这是一个日志套件:正是为
debug\u backtrace
构建的。当然,它不是在处理错误,而是在服务于它的目的:描述执行的上下文。在这种情况下,没有合理的理由不使用
debug\u backtrace
。@mattbasta我想,我们必须同意不同意。记录任意用户活动不是调试,也不是构建
debug\u backtrace
的目的。如果记录器需要有关调用方的此信息,则应将其传递给它。这比在每次日志记录中创建完整的调用堆栈要快得多,也更合适。这对我来说是足够合理的论据。还有更多的人同意我的观点:@Gordon事实证明,
debug\u backtrace
不会增加太多开销。我想说,如果它有效,就使用它。@mattbasta这不是开销,而是原则。这是一个调试函数,主要用于错误处理。它不应该被误用来获取关于调用方对象的信息,除非它用于调试,而日志记录则不是。请参阅和@Gordon这似乎是使用
debug\u backtrace
的一个非常合适的地方。即使这不是错误,谁在乎呢?它返回op需要的信息,并快速执行。这是一个日志套件:正是为
debug\u backtrace
构建的。当然,它不是在处理错误,而是在服务于它的目的:描述执行的上下文。在这种情况下,没有合理的理由不使用
debug\u backtrace
。@mattbasta我想,我们必须同意不同意。记录任意用户活动不是调试,也不是构建
debug\u backtrace
的目的。如果记录器需要有关调用方的此信息,则应将其传递给它。这比在每次日志记录中创建完整的调用堆栈要快得多,也更合适。这对我来说是足够合理的论据。还有更多的人同意我的观点: