获取在PHP中执行当前函数的代码行和文件?

php
2022-08-30 08:32:43

想象一下我有以下情况:

文件1.php

<?php
 include("Function.php");
 log("test");
?>

功能.php

<?php
 function log($msg)
 {
  echo "";
 }
?>

我想更改日志函数,以便它产生以下内容:

测试 (文件: 文件1.php,行号: 3)

那么,有什么方法可以获得在PHP中执行当前函数的代码的文件名和行号吗?

编辑积压工作使用注释:当我在面向对象的编程方式中使用积压工作时,我遇到以下情况。

索引.php

<?php
 include("Logger.static.php");
 include("TestClass.class.php");
 new TestClass();
?>

测试类.class.php

<?php
 class TestClass
 {
   function __construct()
   {
     Logger::log("this is a test log message");
   }
 }
?>

记录器.静态.php

<?php
 class Logger
 {
   static public function log($msg)
   {
     $bt = debug_backtrace();
     $caller = array_shift($bt);
     echo $caller['file'];
     echo $caller['line'];
   }
 }
?>

此示例将作为文件“Index.php”返回,并作为第 4 行返回,这是启动类的位置。但是,它应该返回文件TestClass.class.php和行号6。任何想法如何解决这个问题?


答案 1

您可以使用 debug_backtrace()。

http://us3.php.net/manual/en/function.debug-backtrace.php

因此,在 log 函数中,您将能够检索从中调用 log 函数的文件名和行号。

我在日志记录类中使用此方法,它大大减少了获取有意义的日志数据所需的代码量。另一个好处是可读性。魔术常数在与琴弦混合时往往会变得非常丑陋。

下面是一个简单示例:

function log($msg)
{
  $bt = debug_backtrace();
  $caller = array_shift($bt);

  // echo $caller['file'];
  // echo $caller['line'];

  // do your logging stuff here.    
}

答案 2

debug_backtrace() 可用于通过调用堆栈进行回溯。不过,它可能会很慢,所以如果你正在做大量的日志记录,要小心。

如果您使用的是 PHP 5.3,则可以利用后期静态绑定,并拥有 一个基类方法 ,并且您的子类可以调用它,但仍保留对 和 的静态引用。log()__FILE____LINE__

最后一个选项是在调用函数时作为参数传递和输入。__FILE____LINE__log()


推荐