PHP andaki işlevini yürütürken oluyor kod satırı ve dosya olsun?

2 Cevap

Ben şu durum var düşünün:

Dosya1.php

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

Function.php

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

Aşağıdaki üretecek şekilde ben günlük işlevini değiştirmek istiyorum:

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

Yani, dosya adı ve PHP geçerli fonksiyonunu yürütülen kod satır numarasını almak için herhangi bir yolu var mı?

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

Bu örnek bir dosya "Index.php" olarak dönecektir ve sınıf başlatılan nerede satır 4 numara olarak, bu. Ancak, dosya TestClass.class.php ve satır sayısını 6 dönmek gerekiyordu. Nasıl bunu düzeltmek için herhangi bir fikrin var mı?

2 Cevap

Sen debug_backtrace kullanabilirsiniz ().

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

Yani, günlük işlevi, günlük işlevi çağrıldı hangi dosya ve satır numarası almak mümkün olacaktır.

Benim günlük derslerinde bu yaklaşımı kullanıyorum ve o ölçüde anlamlı günlük verileri almak için gerekli kod miktarını azalttı. Başka bir yararı okunabilirliği olacaktır. Sihirli sabitler dizeleri ile karıştırıldığında oldukça çirkin almak eğilimindedir.

Burada hızlı bir örnek:

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

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

  // do your logging stuff here.    
}

debug_backtrace() çağrı yığını içinden geri iz için kullanılabilir. Ama yavaş olabilir, bu yüzden günlük bir sürü yapıyoruz onunla dikkatli olabilir.

PHP 5.3 kullanıyorsanız ediyorsanız, late static binding yararlanmak ve log() bir temel sınıf yöntemi var, ve çocuk sınıflar diyoruz ama hala {[statik başvuruları korumak olabilir (2)]} ve __LINE__.

Eğer log() function çağırdığınızda son bir seçenek hemen parametreleri olarak __FILE__ ve __LINE__ geçmek olacaktır.