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

想象一下,我有以下情况:

File1.php

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

Function.php

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

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

testing(文件:File1.php,行号:3)

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

编辑积压使用评论:当我使用我的面向对象的编程方式积压时,我有以下情况。

的index.php

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

TestClass.class.php

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

Logger.static.php

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

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

你可以使用debug_backtrace()。

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

因此,在您的日志function中,您将能够检索从中调用日志function的文件名和行号。

我在我的日志logging类中使用这种方法,它已经大大减less了获取有意义的日志数据所需的代码量。 另一个好处是可读性。 与string混合时,魔术常数会变得相当难看。

这里有一个简单的例子:

 function log($msg) { $bt = debug_backtrace(); $caller = array_shift($bt); // echo $caller['file']; // echo $caller['line']; // do your logging stuff here. } 

debug_backtrace()可用于通过调用堆栈追溯。 它可能会很慢,所以如果你做了很多日志logging的话,要小心。

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

当你调用你的log()函数时,最后的选项只是将__FILE____LINE__作为parameter passing。

这是一个古老的问题,但看到我的解决scheme不在这里,我将为后代提供

  try{ throw new Exception(); }catch ( Exception $e ){ $trace = $e->getTrace(); } $length = 0; foreach ($trace as $t){ if( $t['file'] != __FILE__ ){ break; } ++$length; } return array_slice( $trace, ($length - count( $trace ) )); 

你可以使用/ catch来获得一个干净的堆栈跟踪,然后你需要查找包含这个文件的第一行(通常是从那里调用的),如果你知道的话也可以使用跟踪的索引,或者function。

exception堆栈跟踪与执行debug_backtrace(true)几乎相同。