1. ホーム
  2. php

PHP で現在の関数を実行しているコード行とファイルを取得しますか?

2023-11-30 12:39:12

質問

次のような状況があるとします。

ファイル1.php

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

関数.php

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

log関数が以下のように出力されるように変更したいです。

test (ファイル: File1.php, 行数: 3)

では、PHPで現在の関数を実行したコードのファイル名と行番号を取得する方法はあるのでしょうか?

バックログ使用コメントをEDITしました。 オブジェクト指向のプログラミングでbacklogを使うと、以下のような状況になります。

インデックス.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" と行番号4として返されます、これはクラスが開始される場所です。しかし、それはファイルTestClass.class.phpと行番号6を返すことになっています。これを修正する方法について何か考えがありますか?

どのように解決するのですか?

debug_backtrace()を使用することができます。

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

つまり、log関数では、log関数が呼び出されたファイル名と行番号を取得することができるようになるわけです。

私はロギング クラスでこのアプローチを使用しており、意味のあるログ データを取得するために必要なコードの量を大幅に削減しました。もう 1 つの利点は、可読性です。マジック定数は、文字列と混在すると、かなり醜くなる傾向があります。

ここに簡単な例があります。

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

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

  // do your logging stuff here.    
}