Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get code line and file that's executing the current function in PHP?

Tags:

php

Imagine I have the following situation:

File1.php

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

Function.php

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

I want to change the log function so that it would produce the following:

test (file: File1.php, line number: 3)

So, any way to get the file name and the line number of the code that executed the current function in PHP?

EDIT for backlog usage comments: When I use backlog in my object oriented way of programming I have the following situation.

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'];    }  } ?> 

This example will return as file "Index.php" and as line number 4, this is where the class is initiated. However, it is supposed to return the file TestClass.class.php and line number 6. Any idea how to fix this?

like image 614
Tom Avatar asked Aug 09 '09 22:08

Tom


People also ask

How can I get line of code in PHP?

You can use debug_backtrace(). So, in your log function, you would be able to retrieve the filename and line number from which the log function was called. I'm using this approach in my logging classes and it has significantly reduced the amount of code required to get meaningful log data.

How to get current directory in PHP?

The getcwd() function in PHP is an inbuilt function which is used to return the current working directory. This function does not accepts any parameter and returns the current working directory on successful function call or FALSE on failure.

What is __ DIR __ in PHP?

The __DIR__ can be used to obtain the current code working directory. It has been introduced in PHP beginning from version 5.3. It is similar to using dirname(__FILE__). Usually, it is used to include other files that is present in an included file. Consider the following directory structure −


2 Answers

You can use debug_backtrace().

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

So, in your log function, you would be able to retrieve the filename and line number from which the log function was called.

I'm using this approach in my logging classes and it has significantly reduced the amount of code required to get meaningful log data. Another benefit would be readability. Magic constants tend to get quite ugly when mixed with strings.

Here's a quick example:

function log($msg) {   $bt = debug_backtrace();   $caller = array_shift($bt);    // echo $caller['file'];   // echo $caller['line'];    // do your logging stuff here.     } 
like image 196
Lior Cohen Avatar answered Oct 17 '22 11:10

Lior Cohen


debug_backtrace() can be used to trace back through the call stack. It can be slow though, so be careful with it if you're doing a lot of logging.

If you're using PHP 5.3, you could take advantage of late static binding and have a base class method of log(), and your child classes could call it but still maintain static references to __FILE__ and __LINE__.

A final option would be just pass __FILE__ and __LINE__ in as parameters when you call your log() function.

like image 21
zombat Avatar answered Oct 17 '22 12:10

zombat