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