获取在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)几乎相同。